Пользовательский ModelBinder MVC 3 не используется - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть форма, которая публикует кучу скрытых переменных, некоторые с тем же именем. Вот тело сообщения:

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 ]

2 голосов
/ 11 февраля 2011

Попробуйте унаследовать связыватель модели от 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;
    }
}

PS Из получения связывателя базовой модели ядополнительное преимущество связывания всех свойств с использованием стандартного кода Mvc, и тогда я могу расширить десериализованный объект:)

Надеюсь, это поможет

0 голосов
/ 11 февраля 2011

Не удалось заставить это работать. Пришлось реализовать обходной путь.

Сейчас я публикую идентификаторы местоположений в виде строки CSV, и они выбираются связывателем пользовательской модели, поэтому могут быть проанализированы в массиве. Жаль, что я не мог сделать это по-другому.

0 голосов
/ 11 февраля 2011

Зарегистрирован ли этот ModelBinder в DepedencyResolver?Интересно, если MVC не может найти ваш ModelBinder и возвращается к стандартному.

...