首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >维护控制器调用之间的状态

维护控制器调用之间的状态
EN

Stack Overflow用户
提问于 2016-05-26 19:12:01
回答 1查看 70关注 0票数 3

我有这个XML:

代码语言:javascript
运行
复制
<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>

我将其序列化为一个模型,并传递给我的视图:

我观点的一部分

代码语言:javascript
运行
复制
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)。

然后,我在submit按钮上调用我的Controller方法,并获得以下值:

我需要'Default‘来反映用户的选择,在这种情况下应该是'false’。

我已经尝试了我能想到的所有组合,但它仍然是'null‘。

对不起,我遗漏了一些代码:

代码语言:javascript
运行
复制
@Html.HiddenFor(m => m.Section[i].PreferenceModel[j].Name, "Default")

呈现的HTML:

代码语言:javascript
运行
复制
<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"> 

我的模型:

代码语言:javascript
运行
复制
[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; }
}
EN

Stack Overflow用户

回答已采纳

发布于 2016-05-26 20:33:45

您的单选按钮绑定到属性Name,但您需要绑定到属性Default。实际上,单选按钮的值被DefaultModelBinder忽略,因为您还有一个绑定到属性Name的隐藏输入( DefaultModelBinder只设置第一个单选按钮,并忽略具有相同名称的后续表单值)。

在代码中还有一些其他错误,包括在html中生成length="##"属性,这是由于添加string值作为@Html.HiddenFor()的第二个参数(用于添加HtmlAttributes )和设置checked属性(您永远不应该设置该属性,因为绑定到该属性的值决定了选择的内容)。

你的代码应该是

代码语言:javascript
运行
复制
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属性

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37459205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档