我有以下型号:
public class Person
{
public string Name { get; set; }
public string Gender { get; set; }
}
我希望默认的性别为女性,所以我在动作中进行了设置:
public ActionResult Create()
{
var model = new Person { Gender = "F" }; // default is female
return View(model);
}
最后,视图呈现如下所示:
@model Person
@using (Html.BeginForm())
{
@Html.EditorForModel()
<p><input type="submit" value="Create" /></p>
}
这一切都按预期工作。现在,让我们说,我想将性别显示为更直观的一对单选按钮,而不是简单的文本框。所以我制作了以下模板并将其保存到Shared / EditorTemplates / Gender.cshtml:
@model string
@Html.RadioButtonFor(model => model, "F") Female
@Html.RadioButtonFor(model => model, "M") Male
最后,我用[UIHint("Gender")]
装饰性别。
现在可以使用单选按钮正确呈现性别,这很棒,但是......
问题
女性不再预先选择作为默认值,而是最终将两个单选按钮留空。我错过了什么吗?
有趣的是,如果我将RadioButtonFor
从模板移到视图(将model => model
更改为model => model.Gender
),那么一切都按预期工作。我知道这是一个可行的解决方法,但这些模板化的助手是如此惊人,令人上瘾的便利,我宁愿在让他们离开之前用尽所有可能性。
答案 0 :(得分:9)
我知道这很难看,但以下情况可能有效:
@model string
@Html.RadioButton("", "F", Model == "F") Female
@Html.RadioButton("", "M", Model == "M") Male
RadioButton帮助程序的问题是,如果第一个参数为null或为空,它将始终将其视为未检查,从而使此帮助程序不适合编辑器模板。
这是MVC源代码的摘录,说明了我的意思:
bool isChecked = !string.IsNullOrEmpty(name) && string.Equals(htmlHelper.EvalString(name), b, StringComparison.OrdinalIgnoreCase);
作为替代方案,您可以使用custom HTML helper生成单选按钮列表。
答案 1 :(得分:0)
我接受了这个想法并对其进行了扩展。我将List<Dictionary<string,string>>
传递给我添加ViewData
的编辑器模板,用于创建单选按钮。我的模板看起来像这样
@model string
@{
var buttons = (List<Dictionary<string, string>>)ViewData["Buttons"];
}
@foreach (var button in buttons) {
<label class="radio inline">
@Html.RadioButton(Html.NameForModel().ToHtmlString(), Model, Model == button["Value"], new { id = Html.IdForModel() }) @button["Label"]
</label>
}
这是我传递给EditorFor
ViewData
new { Buttons = new List<Dictionary<string, string>> { new Dictionary<string, string> { { "Label", "Commercial" }, { "Value", "Y" } }, new Dictionary<string, string> { { "Label", "Residential" }, { "Value", "N" } } } }
当然,我可以将它添加到ViewModel类型并将其传递给我的控制器中的View,但是在cshtml
文件中执行它会更快。