我看到了一些线程,但是似乎没有适用于MVC4的线程,因为RadioButtonFor html扩展方法/ helper不存在。

假设我有一个列举 list -即航空公司:

public enum Airlines
{
   Unknown = 0,
   BritishAirways = 1,
   VirginAtlantic = 2,
   AirFrance = 3
}

如何将其绑定(bind)到 View 上的单选按钮列表并能够检索所选项目?
如果没有选择,能够说“选择一项”呢?

最佳答案

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

更新

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

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

原始

Views \ Shared \ EditorTemplates目录中的编辑器模板Airlines.cshtml:
@model MvcTest.Models.Airlines
@foreach (var value in Enum.GetValues(typeof(MvcTest.Models.Airlines)))
{
    @Html.RadioButtonFor(m => m, value)
    @Html.Label(value.ToString())
}

该模型:
public class TestModel
{
    [Required(ErrorMessage = "select one item")]
    public Airlines Airline { get; set; }
}

Action 方法:
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);
    }
}

风景:
@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)
}

关于asp.net-mvc - MVC4枚举和单选按钮列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18542060/

10-11 13:30