Как вернуть общее значение модели как «ноль» из связующего элемента модели ASP.NET MVC - PullRequest
0 голосов
/ 03 ноября 2010

У меня есть метод действия, который принимает несколько необязательных параметров.

Этот метод действия 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 и т. Д., Объект все равно будет создан и передан действию.

Мне нужен способ создания связывателя модели, который возвращает ноль для моделиесли он считается пустым.

Первая попытка выглядит следующим образом

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.

Есть ли способ, которым я могу сделать полную 'Model' из пользовательского ModelBinder, чтобы вернуть нуль

1 Ответ

0 голосов
/ 03 ноября 2010

Вы пытались установить параметр по умолчанию null?Вам может также нужно установить тип на nullable, но я не уверен на 100%, если это необходимо, но я так его использую.

Например:

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

Вероятно, я должен отметить, что для этого требуется .NET 4, но затем вы не указали, на какой версии вы работаете.

...