我有这个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>
我将其序列化为模型并传递给我的视图:
我的观看
的一部分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)
}
}
我(作为用户)选择第二个单选按钮(false)。
然后我在提交按钮上调用我的Controller方法,我得到这些值:
我需要'默认'来反映用户选择,在这种情况下应该是'假'。
我已经尝试了我能想到的每一种组合,但它仍然总是'无效'。
抱歉,我错过了一些代码:
@Html.HiddenFor(m => m.Section[i].PreferenceModel[j].Name, "Default")
HTML呈现:
<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 :(得分:3)
您的单选按钮绑定到属性Name
,但您需要绑定到属性Default
。实际上,DefaultModelBinder
会忽略单选按钮的值,因为您还有一个绑定到属性Name
的隐藏输入(DefaultModelBinder
仅设置第一个并忽略后续表单值同名)。
您在代码中还有一些其他错误,包括在html中生成length="##"
属性,这是因为添加string
值作为@Html.HiddenFor()
的第二个参数,用于添加{{ 1}},并设置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>
属性