RadioButton不在编辑器模板中选择值

时间:2011-12-02 14:00:46

标签: asp.net-mvc asp.net-mvc-3

我有以下型号:

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),那么一切都按预期工作。我知道这是一个可行的解决方法,但这些模板化的助手是如此惊人,令人上瘾的便利,我宁愿在让他们离开之前用尽所有可能性。

2 个答案:

答案 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文件中执行它会更快。