Asp.net mvc 4 使用@html.radiobutton为MVC4 ASP.Net绑定4个单选按钮

Asp.net mvc 4 使用@html.radiobutton为MVC4 ASP.Net绑定4个单选按钮,asp.net-mvc-4,view,enums,radiobuttonfor,Asp.net Mvc 4,View,Enums,Radiobuttonfor,这是我的枚举: public enum ValidityTypes : int { [Description("Not Set")] None = 0, [Description("Zero Validity")] ZeroValidity = 1, [Description("Life Time Validity")] LifeTimeValidity = 2, [Description("N Months")] NMonths

这是我的枚举:

public enum ValidityTypes : int
{
    [Description("Not Set")]
    None = 0,
    [Description("Zero Validity")]
    ZeroValidity = 1,
    [Description("Life Time Validity")]
    LifeTimeValidity = 2,
    [Description("N Months")]
    NMonths = 3,
    [Description("Rehire Validity in Months")]
    RehireValidity = 4
}
在这里,我设置了Model属性:

public ValidityTypes ValidityType { get; set; }
以下是我的看法:

<label><b>Zero Validity:</b></label>
@if (Model.ValidityType == Constant.ValidityTypes.ZeroValidity) 
{
    @Html.RadioButtonFor(x => x.ValidityType, "1", new { @id = "validity1", style = "width:50px", @checked = "true" , onClick = "ValidityEnableDisable(this);" })             
}
else
{
    @Html.RadioButtonFor(x => x.ValidityType, "1", new { @id = "validity1", style = "width:50px", @checked = "false" , onClick = "ValidityEnableDisable(this);" })             
}
<label><b>Life Time Validity: </b></label>
@if (Model.ValidityType == OneC.BGV.BE.Constant.ValidityTypes.LifeTimeValidity) 
{
    @Html.RadioButtonFor(x => x.ValidityType, "2", new { @id = "validity2", style = "width:50px", @checked = "true" , onClick = "ValidityEnableDisable(this);" }) 
}
else
{
    @Html.RadioButtonFor(x => x.ValidityType, "2", new { @id = "validity2", style = "width:50px", @checked = "false" , onClick = "ValidityEnableDisable(this);" }) 
}
<label><b>'N' Months:</label>
@if (Model.ValidityType == OneC.BGV.BE.Constant.ValidityTypes.NMonths) 
{ 
    @Html.RadioButtonFor(x => x.ValidityType, "3", new { @id = "validity3", style = "width:50px", @checked = "true", onClick = "Validity3EnableDisable(this);" ,  autocomplete="off" }) 
    @Html.TextBoxFor(x => x.ValidityValue, new { id = "NmonthTextbox", style = "width:50px" })
}
else
{
    @Html.RadioButtonFor(x => x.ValidityType, "3", new { @id = "validity3", style = "width:50px", @checked = "false" , onClick = "Validity3EnableDisable(this);" ,  autocomplete="off"})
    @Html.TextBoxFor(x => x.ValidityValue, new { id = "NmonthTextbox", style = "width:50px", disabled = "true" })
}
零有效期:
@if(Model.ValidityType==Constant.ValidityTypes.zerovality)
{
@RadioButton(x=>x.ValidityType,“1”,新的{@id=“validity1”,style=“width:50px”,@checked=“true”,onClick=“ValidityEnableDisable(this);”)
}
其他的
{
@RadioButton(x=>x.ValidityType,“1”,新的{@id=“validity1”,style=“width:50px”,@checked=“false”,onClick=“ValidityEnableDisable(this);”)
}
终身有效期:
@if(Model.ValidityType==OneC.BGV.BE.Constant.ValidityTypes.LifeTimeValidity)
{
@RadioButton(x=>x.ValidityType,“2”,新的{@id=“validity2”,style=“width:50px”,@checked=“true”,onClick=“ValidityEnableDisable(this);”)
}
其他的
{
@(x=>x.ValidityType,“2”,新的{@id=“validity2”,style=“width:50px”,@checked=“false”,onClick=“ValidityEnableDisable(this);”)
}
“N”个月:
@if(Model.ValidityType==OneC.BGV.BE.Constant.ValidityTypes.NMonths)
{ 
@Html.radiobutton(x=>x.ValidityType,“3”,新的{@id=“validity3”,style=“width:50px”,@checked=“true”,onClick=“Validity3EnableDisable(this);”,autocomplete=“off”})
@Html.TextBoxFor(x=>x.ValidityValue,新的{id=“NmonthTextbox”,style=“width:50px”})
}
其他的
{
@(x=>x.ValidityType,“3”,新的{@id=“validity3”,style=“width:50px”,“checked=“false”,onClick=“Validity3EnableDisable(this);”,autocomplete=“off”})
@Html.TextBoxFor(x=>x.ValidityValue,新的{id=“NmonthTextbox”,style=“width:50px”,disabled=“true”})
}
现在,当我加载此视图时,我得到的是
model.Validitytype
作为
zerovality
,它与数据库中相同,并且满足第一个
if
条件。但在完整视图加载时,
N个月
单选按钮将被选中

为什么我无法显示所选的正确单选按钮? 控件的
@checked
属性不起作用吗?

checked=“true”
checked=“false”
checked=“anythingAtAll”
都表示相同的意思-单选按钮将被选中。
checked
属性是一个
boolean
属性,这意味着它的存在决定了它是否被选中。在您的情况下,始终选中最后一个,因为这是最后一个渲染的属性(属性从之前的属性中删除,因为只允许选中一个属性)

您永远不应该设置
checked
属性,因为
radiobutton()
方法是基于绑定到的模型的值进行设置的(这就是模型绑定的工作方式)。删除所有
if/else
块,并将代码更改为

<label>
    @Html.RadioButtonFor(x => x.ValidityType, ValidityTypes.ZeroValidity, new { id = "", @class = "validity" })
    <span>Zero Validity</span>
</label>
<label>
    @Html.RadioButtonFor(x => x.ValidityType, ValidityTypes.LifeTimeValidity, new { id = "", @class = "validity" })
    <span>Life Time Validity</span>
</label>
// labels below omitted for brevity
@Html.RadioButtonFor(x => x.ValidityType, ValidityTypes.NMonths, new { id = "", @class = "validity" })
@Html.RadioButtonFor(x => x.ValidityType, ValidityTypes.RehireValidity, new { id = "", @class = "validity" })
并用于处理您的事件

$('.validity').click(function() {
    ....
});

谢谢Stephen这么快的回复。但这是一个在点击超链接时作为弹出窗口加载的视图。一页上有10个条目,每个条目都有自己的有效性。因此,当我点击与某个项目相关的超链接时,我会得到该项目的有效性详细信息。这一点都没有区别,所以我只想确认这是否适用于同一项目?在完全加载时,它将向您显示该项目有效性的保存值,并且在同一弹出窗口中,如果我想更改有效性,我应该能够保存新值。正如您所说,要删除所有if-else,我仍然需要显示文本框。您的文本框也没有任何意义(禁用的控件不会发回值,因此它毫无意义)。您没有显示您的
ValidityEnableDisable
脚本是什么,但如果按照其名称禁用控件,则您会犯更多错误。是的,它将显示基于模型中
ValidityType
属性值选择的正确单选按钮。(我假设您的意思是使用ajax调用服务器方法以在DOM中加载模型的部分视图?)
$('.validity').click(function() {
    ....
});