MVC4枚举和单选按钮列表

Ahm*_*yas 48 asp.net-mvc asp.net-mvc-4

我已经看到了一些线程,但似乎没有一个适用于MVC4,因为RadioButtonFor html扩展方法/帮助程序不存在.

说我有一个枚举列表 - 即航空公司:

public enum Airlines
{
   Unknown = 0,
   BritishAirways = 1,
   VirginAtlantic = 2,
   AirFrance = 3
}
Run Code Online (Sandbox Code Playgroud)

如何将其绑定到我的视图上的单选按钮列表,并能够检索所选项目?如果没有选择,可以说"选择一个项目"怎么样?

asy*_*ult 44

您可以为Airlines将呈现单选按钮列表的枚举创建自定义编辑器模板.在您的模型中,您将拥有类型AirlinesRequired属性,并使用属性和集标记此属性ErrorMessage = "select one item".如果需要,请不要忘记将jQuery验证包含在客户端验证中,通常只需要@Scripts.Render("~/bundles/jqueryval")在Layout或View上添加.如果您不使用jQuery验证,则需要在模型上使该属性为空,因为枚举默认设置为第一个值,因此MVC不会将其视为无效.请记住,如果将属性更改为可空,则还需要将编辑器模板的模型类型更改为可为空.

UPDATE

要使编辑器模板能够为任何枚举呈现单选按钮列表,请将模板更改为以下内容:

@model Enum
@foreach (var value in Enum.GetValues(Model.GetType()))
{
    @Html.RadioButtonFor(m => m, value)
    @Html.Label(value.ToString())
}
Run Code Online (Sandbox Code Playgroud)

原版的

编辑模板,Airlines.cshtml,在视图\共享\ EditorTemplates目录:

@model MvcTest.Models.Airlines
@foreach (var value in Enum.GetValues(typeof(MvcTest.Models.Airlines)))
{
    @Html.RadioButtonFor(m => m, value)
    @Html.Label(value.ToString())
}
Run Code Online (Sandbox Code Playgroud)

该模型:

public class TestModel
{
    [Required(ErrorMessage = "select one item")]
    public Airlines Airline { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

动作方法:

public class HomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        return View(new TestModel());
    }

    [HttpPost]
    public ActionResult Index(TestModel model)
    {
        if (ModelState.IsValid)
        {
            return RedirectToAction("Index");
        }

        return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

风景:

@model MvcTest.Models.TestModel
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
@using (Html.BeginForm())
{
    @Html.EditorFor(m => m.Airline)
    <input type="submit" value="Submit" />
    @Html.ValidationSummary(false)
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*ett 31

我建议对其他答案采用类似的方法,但使用以下编辑器模板; EnumRadioButtonList.cshtml,位于Views\Shared\EditorTemplates目录中:

@model Enum
@foreach (var value in Enum.GetValues(Model.GetType()))
{
    var id = TagBuilder.CreateSanitizedId(string.Format(
        "{0}_{1}_{2}", ViewData.TemplateInfo.HtmlFieldPrefix, Model.GetType(), value));
    <div>
        @Html.RadioButton(string.Empty, value, value.Equals(Model), new { id })
        @Html.Label(value.ToString(), new { @for = id })
    </div>
}
Run Code Online (Sandbox Code Playgroud)

id每个单选按钮的HTML 都必须是唯一的.因此,上面的代码id通过using使用绑定属性的名称作为前缀ViewData.TemplateInfo.HtmlFieldPrefix.id如果模型包含使用此枚举的多个属性,并且每个属性都使用此编辑器模板,则这将确保唯一的s.

label每个单选按钮的附带将for正确设置其属性.这意味着用户可以通过单击标签文本来选择单选按钮,这是一个比单选按钮本身更大更好的单击目标.

对于MVC模型绑定,单选按钮的HTML name属性值都将设置为EditorFor调用中指定的属性(Airline在此方案中).

要使用它:

@Html.EditorFor(m => m.Airline, "EnumRadioButtonList")
Run Code Online (Sandbox Code Playgroud)


Mat*_*ily 17

RadioButtonFor是什么意思不存在?我使用MVC4并在我的代码中使用它.对于列表,您可以将多个设置为相同的名称

@Html.RadioButtonFor(x => x.Airlines, Airlines.Unknown)
@Html.RadioButtonFor(x => x.Airlines, Airlines.BritishAirways)
@Html.RadioButtonFor(x => x.Airlines, Airlines.VirginAtlantic)
@Html.RadioButtonFor(x => x.Airlines, Airlines.AirFrance)
Run Code Online (Sandbox Code Playgroud)

这些将与模型绑定,因此在回发时您将看到航空公司设置为所选项目,并且在加载页面时将选择匹配的单选按钮.

  • `RadioButtonFor`使用`type ="radio"`呈现HTML`input`元素.通常,每个人旁边都有一个HTML`标签`,带有一个`for`属性,其值与附带的单选按钮的id相匹配. (2认同)