如何从ASP.NET MVC模型绑定器返回整体模型的值为“null”

时间:2010-11-03 09:47:15

标签: asp.net-mvc modelbinder

我有一个带有几个可选参数的动作方法。

这个ASP.NET MVC动作方法看起来很简单但不能正常工作......

[HttpPost]
public ActionResult UpdateOrder(OrderItem OrderItem, Address ShippingAddress)
{
     if (ShippingAddress != null) {
         // we have a shipping address
     }
}

始终为Address创建ShippingAddress对象,因为 - 好吧 - 就像模型绑定器的工作方式一样。即使表单中不存在ShippingAddress.Address1ShippingAddress.City等字段,仍会创建对象并将其传递给操作。

我想要一种方法来创建一个模型绑定器,如果它被认为是空的,它将为模型返回null。

首次尝试如下

protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    base.OnModelUpdated(controllerContext, bindingContext);

    // get the address to validate
    var address = (Address)bindingContext.Model;

    // if the address is quintessentially null then return null for the model binder
    if (address.Address1 == null && address.CountryCode == null && address.City == null)
    {
        bindingContext.Model = null;
    }
 }

不幸的是,这个简单的解决方案不起作用,我收到以下错误:

InvalidOperationException - 此属性设置器已过时,因为其值现在是从ModelMetadata.Model派生的。

有没有办法让自定义ModelBinder的整体'Model'返回null?

1 个答案:

答案 0 :(得分:0)

您是否尝试将默认参数设置为null?您可能也需要将类型设置为可以为空,但我不是100%确定是否需要它,但这就是我使用它的方式。

例如:

public ActionResult UpdateOrder(OrderItem OrderItem, Address? shippingAddress = null)

我应该注意到这需要.NET 4,但是,你没有指定你正在运行的版本。