2017-10-18 18 views
1

Je classe MVC et l'une des variables a été déclarée comme:Ajout de nouveaux attributs sur RadioButton via la variable modèle MVC

[UIHint("YesNoRadio")] 
[Required(ErrorMessage = "test")] 
public bool? Emergency { get; set; } 

cela crée HTML comme

<div class="radio-inline"><label> 
<input data-val="true" data-val-required="Test" id="Emergency" name="Emergency" type="radio" value="true">Yes</label> 
</div> 
<div class="radio-inline"><label> 
<input id="Emergency" name="Emergency" type="radio" value="false">No</label> 
</div> 

ce que je veux est d'ajouter nouvel attribut, permet de dire div effet = "emergencyExplain" et bouton radio à venir comme

<label><input id="Emergency" name="Emergency" type="radio" value="false" div-effect = "emergencyExplain">No</label> 

YesNoRadio.cshtml est ci-dessous:

@model bool?  
<div class="radio-inline"> 
    <label> 
     @if (Model.HasValue && Model.Value) 
     { 
      @Html.RadioButtonFor(x => x, "true", new { @checked = "checked" }); 
     } 
     else 
     { 
      @Html.RadioButtonFor(x => x, "true"); 
     } 
     Yes 
    </label> 
</div> 
<div class="radio-inline"> 
    <label> 
     @if (Model.HasValue && !Model.Value) 
     { 
      @Html.RadioButtonFor(x => x, "false", new { @checked = "checked" }); 
     } 
     else 
     { 
      @Html.RadioButtonFor(x => x, "false"); 
     } 
     No 
    </label> 
</div> 

et son appelé:

@Html.EditorFor(m => m.Emergency, new { htmlAttributes = new { @class = "form-control" } }) 

Nouveau MVC création de formulaires sorte que toute aide en pointant dans la bonne direction sera appréciée.

Merci

+1

est « emergencyExplain » la valeur d'une propriété dans votre modèle? Et vous devez montrer votre 'YesNoRadio.cshtm l' template –

+0

Oui "emergencyExplain" est l'autre variable de mon modèle. Je ne savais pas '' '' '' YesNoRadio.cshtml'''' était un modèle, merci pour le pointeur. – Jay

Répondre

1

En utilisant l'attribut [UIHint] la méthode juste instruit EditorFor() d'utiliser ce modèle. Il ne transmet aucune donnée supplémentaire au modèle autre que la propriété modell. Vous devez utiliser this overload de EditorFor() où vous passez le nom du modèle et un objet représentant le additionalViewData.

Vous n'avez pas montré la propriété modèle qui contient la valeur que vous souhaitez ajouter à l'attribut data-effect, mais en supposant son

public string Effect { get; set; } 

et vous définissez sa valeur dans la méthode GET avant de passer le modèle la vue, puis supprimez l'attribut [UIHint] de la propriété Emergency et modifier la vue principale de

@Html.EditorFor(m => m.Emergency, "YesNoRadio", new { effect = Model.Effect }) 

changer le template YesNoRadio.cshtml-

<div class="radio-inline"> 
    <label> 
     @Html.RadioButtonFor(x => x, true, new { id = "", div_effect = ViewData["effect"] }) 
     <span>Yes</span> 
    </label> 
    <label> 
     @Html.RadioButtonFor(x => x, false, new { id = "", div_effect = ViewData["effect"] }) 
     <span>No</span> 
    </label> 
</div> 

qui va générer

<input data-val="true" data-val-required="Test" div-effect="emergencyExplain" name="Emergency" type="radio" value="True"> 

Quelques choses à noter au sujet de votre code de la vue actuelle.

  1. En utilisant new { htmlAttributes = new { @class = "form-control" } } ne fera pas quoi que ce soit lorsque vous utilisez une coutume EditorTemplate - sa seule applicable à l'aide des modèles intégrés (comment serait-il savoir quel élément d'appliquer cette classe). Si vous voulez que le nom de la classe appliquée aux boutons radio, ajouter que dans la méthode RadioButtonFor() dans le modèle
  2. Vous n'avez pas besoin (et ne devrait pas) définir l'attribut checked. Ce attribut est défini par la méthode RadiobuttonFor() en fonction de la valeur de la propriété (si ses null, pas de boutons seront sélectionnés, et si son true ou false puis sur le bouton approprié sera sélectionné
  3. Notez aussi l'utilisation de new { id = "" } qui supprime l'id attribut qui génère d'autres être sage doublons qui est html invalide
+0

Merci pour cette explication détaillée. Exactement ce que je voulais et appris quelque chose de nouveau aujourd'hui :). – Jay