我的模板助手使用DropDownListFor并不反映枚举的模型。 为什么?(My templa

2019-10-30 04:38发布

我有一个模型,如下所示:

namespace Q01.Models
{
    public enum Sex { Male, Female }

    public class Person
    {
        public string Name { get; set; }
        public Sex? Sex { get; set; }
    }
}

甲公用事业类获得SelectList对象来填充DropDownListFor定义如下:

using System;
using System.Linq;
using System.Web.Mvc;

namespace Q01.Utilities
{
    public static class Utilities
    {
        public static SelectList EnumToSelectList<TEnum>(this TEnum? obj) where TEnum: struct
        {
            var values = from TEnum x in Enum.GetValues(typeof(TEnum))
                         select new { Value = x, Text = x };
            return new SelectList(values, "Value", "Text");
        }
    }
}

我创建一个名为模板帮手Sex.cshtml的类型Sex ,如下所示:

@using Q01.Utilities
@using Q01.Models
@model Sex?
@Html.DropDownListFor(x => x, Model.EnumToSelectList(), "--Select--")

HomeController ,我创建的一个实例Person ,它如下传递给视图:

using System.Web.Mvc;
using Q01.Models;

namespace Q01.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Create()
        {
            Person p = new Person();
            p.Sex = Sex.Female;
            return View(p);
        }
    }
}

和相应的视图声明如下:

@using Q01.Utilities
@model Q01.Models.Person
@using (Html.BeginForm())
{
    <div>Using Sex.cshtml: @Html.EditorFor(x => x.Sex)</div>
    <div>Not using Sex.cshtml: @Html.DropDownListFor(x => x.Sex, Model.Sex.EnumToSelectList(), "--Select--")</div>
}

的输出的屏幕截图中示出如下:

现在的问题是:为什么Sex.cshtml不反映模型? 应该选择Female ,而不是“ -选择- ”。

Answer 1:

增加价值EnumToSelectList

public static class Utilities
{
    public static SelectList EnumToSelectList<TEnum>(this TEnum? obj, object value) where TEnum: struct
    {
        var values = from TEnum x in Enum.GetValues(typeof(TEnum))
                     select new { Value = x, Text = x };
        return new SelectList(values, "Value", "Text", value);
    }
}

然后Model.EnumToSelectList(x.Sex) 你只需要提供所选值SelectList构造函数。



文章来源: My templated helper using a DropDownListFor does NOT reflect the model of enum. Why?