没有使用MVC 3自定义ModelBinder

时间:2011-02-11 15:45:19

标签: c# asp.net-mvc-3 modelbinders

我有一个表单发布了一堆隐藏的变量,其中一些具有相同的名称。这是帖子的主体:

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。模型绑定器不会执行。我可能错过了一些明显的东西;任何想法?

3 个答案:

答案 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字符串发布,并且它们被自定义模型绑定器拾取,因此可以解析为数组。惭愧我不能这样做。