首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ASP.NET MVC3中绑定到枚举的模型

在ASP.NET MVC3中绑定到枚举的模型
EN

Stack Overflow用户
提问于 2011-05-19 06:25:01
回答 2查看 28.2K关注 0票数 48

我的控制器中有一个方法,它接受一个对象作为参数并返回一个JsonResult。此对象的属性之一是具有三个可能值的枚举。我假设当客户端为该属性传入一个int时,它将填充枚举,但它没有,它缺省为0,枚举被设置为它可能选择的第一个。

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2011-05-19 08:51:14

绑定到模型上的钩子属性又如何呢?

代码语言:javascript
复制
public class SomeModel
{
   public MyEnum EnumValue { get; set; }
   public int BindToThisGuy
   {
      get { return (int) EnumValue; }
      set { EnumValue = (MyEnum)value; }
   }
}
票数 15
EN

Stack Overflow用户

发布于 2012-01-31 05:24:40

好了伙计们。我已经寻找了一些方法来做到这一点,因为我厌倦了编写愚蠢的工作来克服.Net框架中的这个缺陷。基于几个线程,我编写了以下解决方案。

免责声明,这不是一个完全自动化的解决方案,因此它不会适用于所有人。考虑到我的实现,它是有效的。也许我的方法会帮助别人设计出对他们有用的东西。

首先,我创建了一个枚举存储库。枚举不必驻留在这里,但它们需要从存储库中可见。

在存储库中,我创建了一个类和一个公共静态属性来公开枚举类型列表。

代码语言:javascript
复制
namespace MyApp.Enums
{
    public enum ATS_Tabs { TabOne = 0, TabTwo = 1, TabThree = 2, TabFour = 3, TabFive = 4 };

    public class ModelEnums
    {
        public static IEnumerable<Type> Types
        {
            get
            {
                List<Type> Types = new List<Type>();
                Types.Add(typeof(ATS_Tabs));
                return Types;
            }
        }
    }
}

接下来,我创建了一个模型绑定器并实现了IModelBinder接口(ref.kdawg的评论和链接)。

代码语言:javascript
复制
namespace MyApp.CustomModelBinders
{
    public class EnumModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            ModelState modelState = new ModelState { Value = valueResult };
            object actualValue = null;

            try
            {
                return Enum.ToObject(Type.GetType(bindingContext.ModelType.AssemblyQualifiedName), Convert.ToInt32(valueResult.AttemptedValue));
            }
            catch (FormatException e)
            {
                modelState.Errors.Add(e);
            }

            bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
            return actualValue;
        }
    }
}

添加一些代码以确保valueResult.AttemptedValue转换不会失败可能会有所帮助。

接下来,我遍历了上面创建的枚举类型列表,并为它们添加了模型绑定(...in Global.asax.cs)。

代码语言:javascript
复制
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        foreach (Type type in ModelEnums.Types)
        {
            ModelBinders.Binders.Add(type, new EnumModelBinder());
        }

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

我承认,这不是最直观的方式,但它对我很有效。如果我可以优化这一点,请随时告诉我。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6051756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档