c# - MVC Model.IsValid 用于枚举

标签 c# xml asp.net-mvc

我有一个网页,其中包含一个由枚举填充的下拉列表。

public enum RegionType
{
    State,
    [System.Xml.Serialization.XmlEnumAttribute("County/District")]
    County_District,
    [System.Xml.Serialization.XmlEnumAttribute("City/Town")]
    City_Town,
    Municipality,
    Village
}

下拉列表其实是通过下面的方式来表达枚举的:

public static List<string> GetRegionTypes()
{
    List<string> theReturn = new List<string>();
    theReturn.Add("");
    foreach (RegionType s in Enum.GetValues(typeof(RegionType))) {
        theReturn.Add(GetXmlEnumValue(s));
    }
    return theReturn;
}

效果很好,下拉列表显示了正确的值和所有内容。问题在于我具有“xmlenum”属性的 2 个值。如果我选择“国家/地区”或“城市/城镇”作为区域类型,则模型的“RegionType”属性无法将其转换为 MVC Controller POST 操作中的相应枚举。我如何让它正确地进行翻译?

最佳答案

您可以定义以下扩展方法,将枚举类型转换为可供 DropDownListFor 助手使用的 SelectList:

public static class EnumExtensions
{
    public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
    {
        var enumType = typeof(TEnum);
        if (enumType.IsGenericType && enumType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            enumType = enumType.GetGenericArguments()[0];
        }

        var fields = enumType.GetFields(
            BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public
        );
        var values = Enum.GetValues(enumType).OfType<TEnum>();
        var items =
            from value in values
            from field in fields
            let xmlEnumAttribute = field
                .GetCustomAttributes(
                    typeof(XmlEnumAttribute), true
                )
                .OfType<XmlEnumAttribute>()
                .FirstOrDefault()
            let name = (xmlEnumAttribute != null)
                ? xmlEnumAttribute.Name
                : value.ToString()
            where value.ToString() == field.Name
            select new { Id = value, Name = name };
        return new SelectList(items, "Id", "Name", enumObj);
    }
}

然后就很简单了。你有一个 View 模型:

public class MyViewModel
{
    [Required]
    public RegionType? Region { get; set; }
}

Controller :

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Region = RegionType.City_Town
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        return Content("Thanks for choosing " + model.Region.Value.ToString());
    }
}

和一个 View :

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.DropDownListFor(x => x.Region, Model.Region.ToSelectList(), "-- Region --")
    @Html.ValidationMessageFor(x => x.Region)
    <button type="submit">OK</button>
}

关于c# - MVC Model.IsValid 用于枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12537676/

相关文章:

c# - 如何 : Dynamically Creating the XML file content and sending as a text file in asp.net c#

c# - 如果字符串以 <?xml... ?> 部分开头,则将 xml 字符串解析为 xml 文档失败

xml - 有没有办法用垂直对齐方式漂亮地打印 XML?

javascript - 在 Ajax 链接上单击 javascript 错误?

c# - 参差不齐的任务数组 - 并发问题

c# - 如何将 WPF TextBlock 文本绑定(bind)到不同的属性?

c# - 在 asp.net MVC6 View 中删除 if 语句的最佳方法

c# 正则表达式将 <br/> 或 [br/] 替换为 [pre=html]code[br/]code[/pre] 之间的 "\n"

c# - 使用指定属性按字母顺序对通用对象列表进行排序

c# - 如何在 .net 中有条件地继承类