Связыватель модели по умолчанию не связывается для типов Nullable в IEnumerable - PullRequest
13 голосов
/ 02 мая 2011

У меня есть действие контроллера, определение которого выглядит как-

public ActionResult ChangeModel( IEnumerable<MyModel> info, long? destinationId)

И модель:

public class MyModel
{
    public string Name; //Gets populated by default binder
    public long? SourceId; //remains null though the value is set when invoked
}

Свойство 'Name' заполняется вдействие контроллера, однако свойство SourceId остается нулевым.Параметр destinationId , который является long? , также заполняется.

При пошаговом выполнении исходного кода MVC (версия 2) это исключение, выбрасываемое DefaultModelBinder.

Преобразование параметра из типа 'System.Int32' в тип 'System.Nullable`1 [[System.Int64, mscorlib, Версия = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089]]' не удалось, так какникакой преобразователь типов не может конвертировать между этими типами.

Если модель заменяется на long вместо long?, средство связывания модели по умолчанию устанавливает значение.

public class MyModel
{
    public string Name {get;set;}; //Gets populated by default binder
    public long SourceId {get;set;}; //No longer long?, so value gets set
}

Является ли это известной проблемой?Поскольку исходный код MVC оптимизирован, я не могу выполнить большую часть кода.

Обновление: отправляемый запрос - это HTTP-запрос POST с использованием Json с исходным JSon, похожим на -

{"info":[{"Name":"CL1","SourceId":2}], "destinationId":"1"}

Ответы [ 3 ]

4 голосов
/ 18 октября 2011

Возможно, уже слишком поздно, но я нашел обходной путь.Вы можете преобразовать поле SourceId в строку перед отправкой данных.Таким образом, ваши данные в формате JSON будут выглядеть как

{"info":[{"Name":"CL1","SourceId":"2"}], "destinationId":"1"}

Это сработало в моей ситуации (Int32 -> десятичное ?, ASP NET MVC 3)

2 голосов
/ 02 мая 2011

Я бы порекомендовал вам использовать свойства вместо полей в вашей модели представления:

public class MyModel
{
    public string Name { get; set; }
    public long? SourceId { get; set; }
}

Теперь следующий запрос:

/somecontroller/changemodel?destinationId=123&info[0].Name=name1&info[0].SourceId=1&info[1].Name=name2&info[1].SourceId=2

Заполняет модель отлично.

1 голос
/ 02 мая 2011

Подшивка модели по умолчанию анализирует все значения SourceId как целые. Но, похоже, в .NET отсутствует конвертер типов по умолчанию от int до long?.

Я бы реализовал преобразователь типа для этого случая.

...