我有一个带有几个可选参数的动作方法。
这个ASP.NET MVC动作方法看起来很简单但不能正常工作......
[HttpPost]
public ActionResult UpdateOrder(OrderItem OrderItem, Address ShippingAddress)
{
if (ShippingAddress != null) {
// we have a shipping address
}
}
始终为Address
创建ShippingAddress
对象,因为 - 好吧 - 就像模型绑定器的工作方式一样。即使表单中不存在ShippingAddress.Address1
,ShippingAddress.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?
答案 0 :(得分:0)
您是否尝试将默认参数设置为null
?您可能也需要将类型设置为可以为空,但我不是100%确定是否需要它,但这就是我使用它的方式。
例如:
public ActionResult UpdateOrder(OrderItem OrderItem, Address? shippingAddress = null)
我应该注意到这需要.NET 4,但是,你没有指定你正在运行的版本。