2016-05-26 5 views
3

У меня есть этот XML:поддерживать состояние между контроллером вызовами

<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> 

Я сериализую к модели и перейти к моему Виду:

части моего View

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 (как пользователь) выбирает второй переключатель (ложь)

Затем я вызываю свой контроллер Метод эр на кнопку отправки, и я получаю следующие значения:

enter image description here

Мне нужно «по умолчанию», чтобы отразить выбор пользователей, которые в этом случае должны быть «ложным».

Я попробовал каждую комбинацию я могу думать, но он по-прежнему всегда «нулевой»

кто может мне помочь?

благодаря

К сожалению, я пропустил немного кода из:

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

HTML-Rendered:

<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"> 

моя модель:

[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

Вы разместили выражение html.hiddenfor внутри формы? –

+0

@ StianStandahl да. Конечно. спасибо –

+0

У вас есть образец полученного html? –

ответ

3

Ваши радио-кнопок привязка к свойству Name, но вы должны быть привязаны к собственности Default. Как бы то ни было, значения переключателей игнорируются DefaultModelBinder, потому что у вас также есть скрытый ввод, связанный с свойством Name (DefaultModelBinder устанавливает только первый и игнорирует последующие значения формы с тем же именем).

У вас также есть несколько других ошибок в коде, в том числе генерации length="##" атрибутов в вашем HTML, вызванное добавлением значения string в качестве второго параметра @Html.HiddenFor(), который предназначен для добавления HtmlAttributes, и установив атрибут checked (который вы никогда не должны, потому что его значение свойства, привязка которого определяет, что выбрано).

Вы код должен быть

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> 
    } 
} 

Несколько вещей, чтобы отметить. Ваше использование @Html.Label() не подходит. У вас нет связанного управления формой для свойства Name. Оберните переключатели в <label> элементах и ​​включите соответствующий текст, чтобы щелкнуть по тексту, чтобы переключить кнопку. Удалить атрибут id от

+0

Спасибо, что вы так легко выглядите. Я думал, что @ Html.Label() не нужен связанный элемент управления, но @ Html.LabelFor() сделал ..? –

+0

Оба генерируют элемент '

+0

еще раз - спасибо :) –

Смежные вопросы