Dan*_*zzi 5 asp.net-mvc asp.net-mvc-3
我有以下型号:
public class Person
{
public string Name { get; set; }
public string Gender { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望默认的性别为女性,所以我在动作中设置了:
public ActionResult Create()
{
var model = new Person { Gender = "F" }; // default is female
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
最后,视图呈现如下所示:
@model Person
@using (Html.BeginForm())
{
@Html.EditorForModel()
<p><input type="submit" value="Create" /></p>
}
Run Code Online (Sandbox Code Playgroud)
这一切都按预期工作.现在,让我们说,而不是简单的文本框,我想将性别显示为一组更直观的单选按钮.所以我制作了以下模板并将其保存到Shared/EditorTemplates/Gender.cshtml:
@model string
@Html.RadioButtonFor(model => model, "F") Female
@Html.RadioButtonFor(model => model, "M") Male
Run Code Online (Sandbox Code Playgroud)
最后,我装饰了性别[UIHint("Gender")].
现在通过单选按钮正确呈现性别,这很棒,但是...
问题
女性不再预先选择作为默认值,而是最终将两个单选按钮留空.我错过了什么吗?
有趣的是,如果我RadioButtonFor从模板移动到视图(更改model => model为model => model.Gender),那么一切都按预期工作.我知道这是一个可行的解决方法,但这些模板化的助手是如此惊人,令人上瘾的便利,我宁愿在让他们离开之前用尽所有可能性.
我知道这很丑,但以下可能有效:
@model string
@Html.RadioButton("", "F", Model == "F") Female
@Html.RadioButton("", "M", Model == "M") Male
Run Code Online (Sandbox Code Playgroud)
RadioButton帮助程序的问题是,如果第一个参数为null或为空,它将始终将其视为未检查,从而使此帮助程序不适合编辑器模板.
这是MVC源代码的摘录,说明了我的意思:
bool isChecked = !string.IsNullOrEmpty(name) && string.Equals(htmlHelper.EvalString(name), b, StringComparison.OrdinalIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
作为替代方案,您可以使用自定义HTML帮助程序生成单选按钮列表.