2011-02-11 35 views
2

我有一个窗体,张贴一堆隐藏的变量,一些具有相同的名称。这里的帖子正文:MVC 3自定义ModelBinder不被使用

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

无法让这个工作。必须实施一种解决方法。

我现在将位置ID发布为CSV字符串,并且它们正在被自定义模型绑定器拾取,因此可以解析到数组中。耻辱我不能以其他方式去做。

0

ModelBinder是否注册了DepedencyResolver?我不知道MVC是否无法找到您的ModelBinder,并且正在回落到默认模式。

+0

我试图在全球注册模型绑定.asax Application_Start,但没有帮助。另外,项目中还有其他几个自定义模型粘合剂,它们看起来很像我的,它们也可以工作。我只是不明白为什么我的没有。我是否需要将'location'后缀变量重命名为其他内容? – Edgar

2

尝试从System.Web.Mvc.DefaultModelBinder继承模型活页夹,并覆盖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编码结合所有属性的额外好处,然后我可以延长反序列化对象:)

希望这有助于

+0

在我的解决方法中使用此方法。完美工作是因为我将发布的变量更改为CSV字符串。 – Edgar