Asp.net mvc MVC4枚举和单选按钮列表

Asp.net mvc MVC4枚举和单选按钮列表,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我在这方面见过一些线程,但没有一个线程适用于MVC4,因为RadioButtonOnHTML扩展方法/helper不存在 假设我有一个枚举列表-即航空公司: public enum Airlines { Unknown = 0, BritishAirways = 1, VirginAtlantic = 2, AirFrance = 3 } 如何将其绑定到视图上的单选按钮列表并检索所选项目? 如果没有选择,可以说“选择一个项目”怎么样 你所说的RadioButton不存在

我在这方面见过一些线程,但没有一个线程适用于MVC4,因为RadioButtonOnHTML扩展方法/helper不存在

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

public enum Airlines
{
   Unknown = 0,
   BritishAirways = 1,
   VirginAtlantic = 2,
   AirFrance = 3
}
如何将其绑定到视图上的单选按钮列表并检索所选项目?
如果没有选择,可以说“选择一个项目”怎么样

你所说的RadioButton不存在是什么意思?我使用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)

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

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

更新

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

@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())
}
@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>
}
模型:

public class TestModel
{
    [Required(ErrorMessage = "select one item")]
    public Airlines Airline { get; set; }
}
行动方法:

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)
}
@model MvcTest.Models.TestModel
@{
ViewBag.Title=“Index”;
Layout=“~/Views/Shared/_Layout.cshtml”;
}
指数
@使用(Html.BeginForm())
{
@EditorFor(m=>m.Airline)
@Html.ValidationSummary(false)
}

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

@model MvcTest.Models.Airlines
@foreach (var value in Enum.GetValues(typeof(MvcTest.Models.Airlines)))
{
    @Html.RadioButtonFor(m => m, value)
    @Html.Label(value.ToString())
}
@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>
}

我将最高评分的答案提高了一点,以反映选定的值。 将其另存为EnumRadioButton.cshtml到共享视图编辑器模板文件夹:

@模型枚举
@foreach(Enum.GetValues(Model.GetType())中的var值)
{
如果(等于(模型、值))
{
@RadioButton(m=>m,value,new{@checked=“checked”})
}
其他的
{
@RadioButton(m=>m,值)
}
@Html.Label(value.ToString())
}
用法:

@Html.EditorFor(item => Model.MyEnumType, "EnumRadioButton")
@Html.EditorFor(m => m.TestEnumProperty, "EnumRadioButtonList")

我能够将其他答案中的一些方法与一些附加功能结合起来:

EnumRadioButtonList.cshtml

用法:

@Html.EditorFor(item => Model.MyEnumType, "EnumRadioButton")
@Html.EditorFor(m => m.TestEnumProperty, "EnumRadioButtonList")
收益率:

我还将引导单选按钮样式与内联版本的单独助手一起使用:

EnumRadioButtonListInline.cshtml

@模型枚举
@foreach(EnumHelper.GetSelectList(Model.GetType())中的变量项)
{
@RadioButton(string.Empty、item.Value、Model.Equals(Enum.Parse(Model.GetType()、item.Value)))
@项目.案文
}

谢谢!我会试试这个,很快给你回复。如果我不想在列表中显示某个枚举,该怎么办?假设我正在处理的所有枚举都将具有“未知”。我怎样才能确保它不会被渲染,同时也确保在列表中选择了一个值?好的,尝试这个对我来说并不太有效。我没有单选按钮列表,只是一个文本框。我怎样才能创建一个局部视图,并给它一个枚举,然后让该局部视图获取枚举,并一般地为枚举中的每个项目弹出单选按钮,但同时让回发/提交将所选值绑定到视图模型?如果要将某个值保留在列表之外,只需在循环并检查它。创建局部视图而不是编辑器模板应该相当容易,区别在于语义,因为编辑器模板是局部视图。只需在所需的view\controller目录中创建一个部分视图,尽管将其放在共享目录中可能更有意义,然后将代码从编辑器模板复制到其中。然后使用
@Html.Partial(“partialViewName”,model)
并将主视图模型中的枚举作为模型传入。我不知道为什么会得到文本框而不是单选按钮列表。当我在本地运行它时,我发布的代码为我工作。尝试检查您的代码,确保它与我发布的内容完全匹配。另外,我得到一个文本框,editorfor如何知道它应该使用该editortemplate(带有@model Enum的一个)?我认为Ahmed的意思是,MVC4之前不存在
RadioButtonOn
,并且他发现的示例没有使用helper方法。我不确定我是否遵循。通常,对于这样的列表,我在顶部只有一个标签,上面写着“选择最佳…”RadioButton,用于
使用
type=“radio”
呈现HTML
input
元素。通常,在每个标签旁边都有一个HTML
标签
,带有一个
for
属性,该属性的值与附带单选按钮的id匹配。在本例中,您应该能够只执行@HTML.LabelFor(x=>x.Airlines)。我已经使用我建议的方法添加了一个答案。此解决方案非常适合编辑页面。然而,在创建页面中,还没有为enum单选按钮选择任何项目,我得到的是“对象引用未设置为对象的实例”。有解决这个问题的办法吗?谢谢@RichardEverett。我实例化了模型对象,然后将其传递给视图,它现在可以工作了。