我有一个表单发布了一堆隐藏的变量,其中一些具有相同的名称。这是帖子的主体:
OfferId=3802&DeliveryDate=11%2F02%2F2011&DeliveryTime=12%3A00&location=1&location=698
将其发布到MVC操作:
[HttpPost]
public ActionResult DeliveryOptions(DeliveryOptions model)
{
...
}
DeliveryOptions模型如下所示:
public class DeliveryOptions
{
public long? OfferId { get; set; }
[CustomValidation(typeof(CustomValidator), "IsDeliveryDateValid")]
public DateTime? DeliveryDate { get; set; }
public DateTime? DeliveryTime { get; set; }
[CustomValidation(typeof(CustomValidator), "IsLocationsValid")]
public OfferLocations Locations { get; set; }
}
现在,我想将发布的location
变量解析为OfferLocations对象,如下所示:
[ModelBinder(typeof(OfferLocationsModelBinder))]
public class OfferLocations
{
[Required]
public int[] LocationIds { get; set; }
}
模型绑定器目前看起来像这样:
public class OfferLocationsModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
throw new NotImplementedException();
}
}
问题是,我无法打破NotImplementedException。模型绑定器不会执行。我可能错过了一些明显的东西;任何想法?
答案 0 :(得分:2)
尝试从System.Web.Mvc.DefaultModelBinder
继承您的Model Binder,并覆盖object BindModel(ControllerContext, ModelBindingContext)
方法。看看这是否有效。如果是的话 - 你可以在那里工作:)
这就是我现在正在做的事情。基本上,我必须确保如果请求中有特定类型 - 则针对此值执行方法。模型绑定器注册代码完全相同 - 应用于属性类的属性。
模型绑定器如下:
public class TableModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var result = base.BindModel(controllerContext, bindingContext) as ITableModel;
if (result != null)
result.UpdateSorter();
return result;
}
}
P.S。从基本模型绑定器派生给我带来使用标准Mvc代码绑定所有属性的额外好处,然后我可以扩展反序列化对象:)
希望这有帮助
答案 1 :(得分:0)
是否已使用DepedencyResolver注册了ModelBinder?我想知道MVC是否在找到你的ModelBinder时遇到了麻烦,并且正在回归默认的那个。
答案 2 :(得分:0)
无法让这个工作。不得不实施一种解决方法。
我现在将位置ID作为CSV字符串发布,并且它们被自定义模型绑定器拾取,因此可以解析为数组。惭愧我不能这样做。