如何在cusome binder中设置数据类型

时间:2016-08-10 07:00:34

标签: asp.net-mvc asp.net-mvc-4 binding

我有一个如下所示的类,它是一个仅用于mvc中的DateTime的客户绑定器:

public class PersianDateModelBinder : IModelBinder
{

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {...}
}

我希望像这样设置这个:

    public ActionResult Register([ModelBinder(typeof(PersianDateModelBinder))]  User user)
    {...}

如何在这里设置DateType?例如,我想在上面代码中设置DateTime。

1 个答案:

答案 0 :(得分:1)

首先,我建议您实现从DefaultModelBinder基类派生而不是从IModelBinder接口派生的自定义模型绑定器。这样,您只需要覆盖所需的方法,而不是实现整个界面。

至于你的问题,如果我理解你是正确的,你想使用一些自定义逻辑绑定User类的DateTime属性。我认为你的意图应该有所帮助:

您需要覆盖自定义模型装订器的GetPropertyValue方法

protected override object GetPropertyValue(ControllerContext controllerContext, 
        ModelBindingContext bindingContext, 
        System.ComponentModel.PropertyDescriptor propertyDescriptor, 
        IModelBinder propertyBinder){
     if (propertyDescriptor.PropertyType== typeof(DateTime))
     {
        //your logic here
     }

}

如果您的模型可以同时具有应使用默认日期时间绑定的属性,则可以创建自定义属性以标记应使用自定义绑定的属性

[AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class PersianDateAttribute : Attribute
{
}

然后检查模型绑定器中是否存在此属性:

if (propertyDescriptor.PropertyType== typeof(DateTime) && propertyDescriptor.Attributes.OfType<PersianDateAttribute >().Any())
{
    //your logic here
}
else
{
    return base.GetPropertyValue(bindingContext, propertyDescriptor, propertyBinder);
}

实施模型绑定后,您可以像以前一样使用它:

public ActionResult Register([ModelBinder(typeof(PersianDateModelBinder))]  User user)

或以Application_Start方法全局注册:

ModelBinders.Binders.DefaultBinder = new PersianDateModelBinder();