在Controller调用之间保持状态

时间:2016-05-26 11:12:01

标签: c# asp.net-mvc

我有这个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方法,我得到这些值:

enter image description here

我需要'默认'来反映用户选择,在这种情况下应该是'假'。

我已经尝试了我能想到的每一种组合,但它仍然总是'无效'。

抱歉,我错过了一些代码:

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

1 个答案:

答案 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>属性