2016-05-26 10 views
3

Ich habe diese XML:pflegen Zustand zwischen Controller-Calls

<Preferences> 
    <Section Name="PREF_SECTION_NAME_1"> 
    <Preference Name="PREF_NOTIFY_1" Type="radio">  
      <Options>  
       <Option Name="PREF_OPT_YES" Value="true"/>  
       <Option Name="PREF_OPT_NO" Value="false"/>  
      </Options>  
      <Default>true</Default>  
     </Preference> 
    </Section> 
</Preferences> 

ich serialisiert dies zu einem Modell und passt am besten zu meiner Ansicht:

Teil meiner Ansicht

case "radio": 
    <b>@Html.Label(Model.Section[i].PreferenceModel[j].Name)</b> 

    for (var r = 0; r != Model.Section[i].PreferenceModel[j].Options.Count(); r++) 
    { 
     if (Model.Section[i].PreferenceModel[j].Default == Model.Section[i].PreferenceModel[j].Options[r].Value) 
     { 
      @Html.RadioButtonFor(m => m.Section[i].PreferenceModel[j].Name, Model.Section[i].PreferenceModel[j].Options[r].Value, new { @checked = true }) 
     } 
     else 
     { 
      @Html.RadioButtonFor(m => m.Section[i].PreferenceModel[j].Name, Model.Section[i].PreferenceModel[j].Options[r].Value) 
     } 
    } 

I (als Benutzer) wählt die 2. Radio-Taste (falsch)

Ich rufe dann meine Kontrolle er Methode auf der Submit-Button und ich bekommen diese Werte:

enter image description here

Ich brauche ‚Standard‘, um den Benutzer Wahl widerspiegeln, die in diesem Fall sollten ‚falsch‘ sein.

Ich habe jede Kombination versuchte ich mir vorstellen kann, aber es ist noch immer ‚null‘

jemand kann mir helfen?

dank

Leider habe ich aus ein Stück Code verpasst:

@Html.HiddenFor(m => m.Section[i].PreferenceModel[j].Name, "Default") 

die HTML gerendert:

<h1><label for="PREF_SECTION_NAME_1">PREF_SECTION_NAME_1</label></h1> 
<div class="clear"></div> 
<input length="4" id="Section_0__PreferenceModel_0__Type" name="Section[0].PreferenceModel[0].Type" type="hidden" value="radio"> 
<input length="4" id="Section_0__PreferenceModel_0__Name" name="Section[0].PreferenceModel[0].Name" type="hidden" value="PREF_NOTIFY_1">        
<b><label for="PREF_NOTIFY_1">PREF_NOTIFY_1</label></b> 

<input checked="True" id="Section_0__PreferenceModel_0__Name" name="Section[0].PreferenceModel[0].Name" type="radio" value="true"> 
<input id="Section_0__PreferenceModel_0__Name" name="Section[0].PreferenceModel[0].Name" type="radio" value="false"> 
<input length="7" id="Section_0__PreferenceModel_0__Name" name="Section[0].PreferenceModel[0].Name" type="hidden" value="PREF_NOTIFY_1"> 

mein Modell:

[XmlRoot("Preferences")] 
public class PreferencesModel 
{ 
    /// <summary> 
    /// Message to display to user on UI 
    /// </summary> 
    [XmlIgnore] 
    public string MessageToUser { get; set; } 
    /// <summary> 
    /// Stores Preferences 
    /// </summary> 
    [XmlElement(ElementName = "Section")] 
    public List<Section> Section { get; set; } 
} 

public class Section 
{ 
    /// <summary> 
    /// Name of Section (for Grouping Purposes) 
    /// </summary> 
    [XmlAttribute("Name")] 
    public string Name { get; set; } 
    /// <summary> 
    /// List of Preferences for this section 
    /// </summary> 
    [XmlElement("Preference")] 
    public List<PreferenceModel> PreferenceModel { get; set; } 
} 

public class PreferenceModel 
{ 
    /// <summary> 
    /// Type of HTML Control ie radio button, textbox 
    /// </summary> 
    [XmlAttribute("Type")] 
    public string Type { get; set; } 
    /// <summary> 
    /// Name of Preference 
    /// </summary> 
    [XmlAttribute("Name")] 
    public string Name { get; set; } 
    /// <summary> 
    /// 
    /// </summary> 
    //[XmlAttribute("Default")] 
    [XmlElement("DefaultValue")] 
    public string DefaultValue { get; set; } 

    [XmlIgnore] 
    public bool CheckBoxValue 
    { 
     get 
     { 
      bool flag; 
      if (Boolean.TryParse(DefaultValue, out flag)) 
      { 
       return flag; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     set 
     { 
      DefaultValue = value.ToString(); 
     } 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    [XmlElement("Options")] 
    public List<Option> Options { get; set; } 
} 

[XmlType("Option")] 
public class Option 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    [XmlAttribute("Name")] 
    public string Name { get; set; } 
    /// <summary> 
    /// 
    /// </summary> 
    [XmlAttribute("Value")] 
    public string Value { get; set; } 
} 
+0

haben Sie den Ausdruck html.hiddenfor in das Formular eingefügt? –

+0

@StianStandahl ja. Na sicher. danke –

+0

hast du ein beispiel für den resultierenden html? –

Antwort

3

Ihre Radio-Buttons sind Bindung an Eigentum Name, aber Sie müssen für die Eigenschaft verbindlich sein Default. So werden die Werte der Optionsfelder von DefaultModelBinder ignoriert, da Sie auch einen ausgeblendeten Eingang haben, der an die Eigenschaft Name gebunden ist (der DefaultModelBinder setzt nur den ersten Wert und ignoriert nachfolgende Formularwerte mit demselben Namen).

Sie haben auch ein paar andere Fehler im Code, einschließlich Erzeugung length="##" Attribute in Ihrem HTML verursacht durch einen string Wert als zweiten Parameter von @Html.HiddenFor() Zugabe, die für das Hinzufügen von HtmlAttributes ist, und Einstellen des checked Attribut (die Sie sollten nie da es ist der Wert der Eigenschaft, an die Ihre Bindung gebunden ist, die bestimmt, was ausgewählt ist).

Sie Code sollte

case "radio": 
    <b>@Model.Section[i].PreferenceModel[j].Name</b> 
    for (var r = 0; r != Model.Section[i].PreferenceModel[j].Options.Count; r++) 
    { 
     <label> 
      @Html.RadioButtonFor(m => m.Section[i].PreferenceModel[j].Default, Model.Section[i].PreferenceModel[j].Options[r].Value, new { id = "" }) 
      <span>@Model.Section[i].PreferenceModel[j].Options[r].Name</span> 
     </label> 
    } 
} 

Ein paar Dinge zu beachten sein. Ihre Verwendung von @Html.Label() ist nicht geeignet - Sie haben kein zugeordnetes Formularsteuerelement für die Eigenschaft Name. Wickeln Sie die Optionsschaltflächen in die Elemente <label> ein und fügen Sie den zugehörigen Text ein. Durch Klicken auf den Text wird die Schaltfläche umgeschaltet. Entfernen Sie das id Attribut von

+0

Danke, dass du es so leicht siehst. Ich hatte gedacht, dass @ Html.Label() kein zugeordnetes Formular-Steuerelement benötigt, aber @ Html.LabelFor() tat ..? Beide –

+0

erzeugen ein ''

+0

nochmal - danke :) –

Verwandte Themen