我有一个如下所示的类,它是一个仅用于mvc中的DateTime的客户绑定器:
public class PersianDateModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{...}
}
我希望像这样设置这个:
public ActionResult Register([ModelBinder(typeof(PersianDateModelBinder))] User user)
{...}
如何在这里设置DateType?例如,我想在上面代码中设置DateTime。
答案 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();