我看到了一些线程,但是似乎没有适用于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/