Со следующим простым действием ...ASP.NET MVC Добавлено потерянный интерфейс модели Значения свойств и ModelState имеют ошибки. Ограничение привязки модели? Вопрос о сериализации?
[HttpPost]
public PartialViewResult DoSomething(AnimalInfo animalInfo)
{
// animalInfo.AnimalKey SHOULD == DogKey { Id = 1, Name = "Dog" }
// BUT animalInfo.AnimalKey == null
return Something();
}
Проводка к этому действию в порядке, и большинство свойств animalInfo были доступны, для объекта я создал сам, за исключением. Я предполагал, что это проблема с сериализацией, поэтому я добавил некоторую базовую сериализацию в мой класс, но я все равно получаю null для объекта AnimalKey (что определенно не является нулевым во время рендеринга).
Вот как я определяю AnimalInfo:
[DataContract]
public class AnimalInfo : IAnimalInfo
{
[DataMember]
public IAnimalKey AnimalKey { get; set; }
public string Name { get; set; }
}
[DataContract]
public class DogKey : IAnimalKey
{
public DogKey(int id){ DogId = id; }
[DataMember]
public int DogId { get; set; }
}
И я отправляю к действию с целью, как это ...
<% var currentAnimal = new AnimalInfo { AnimalKey = new DogKey(1), Name = "Dog" }; %>
<% using (Html.BeginForm("DoSomething", "Controller", currentAnimal.AnimalInfo))
{
%><button type="submit">post</button><%
} %>
Но к тому времени мое действие выполняется, AnimalKey имеет станет нулевым, а Name - «Собака». Взгляд в ModelState показывает то же самое. Это похоже на проблему с сериализацией. Это так? Если это так, DataContract и DataMember недостаточно подходят для обработки этого метода?
UPDATE
В качестве альтернативного подхода, я попытался изменить его сильно типизированной и использование HiddenFor для размещения данных, но я все еще получаю точно такой же результат.
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Namespace.IAnimalInfo>" %>
<% using (Html.BeginForm("DoSomething", "OM", Model))
{
Html.HiddenFor(m => m.AnimalKey);
Html.HiddenFor(m => m.Name);
%><button type="submit">revert</button><%
} %>
Do MVC HtmlHelpers не сериализации сложных объектов на всех?
Или мне нужно создать другую модель для каждого AnimalKey, чтобы вернуть эти значения?
Или даже написать собственный сериализатор для строки для скрытого, а затем десериализовать его в обратном пути?
PROBABAL ПРИЧИНА
После немного более бесполезный Я почти уверен, что это связано с IAnimalKey быть интерфейсом. Когда я добавил другое свойство DogKey к моей модели, значение возвращается. Таким образом, кажется, что он потерял свои знания о том, какой тип объекта был на этом посту или вообще не поддерживает интерфейсы.
DIRTY FIX
Смотрите мой ответ
Я не думаю, что вы можете передать богатый объект в «BeginForm». Объект используется для создания «RouteValueCollection», который представляет собой просто плоский словарь, а не полное дерево объектов. – bhamlin
Если вы посмотрите на HTML, сгенерированный Html.HiddenFor (m => m.AnimalKey) ;, как он выглядит: как называется сгенерированное скрытое поле и каково его значение? – Rune
Я просто сталкиваюсь с подобной ситуацией ... независимо от того, что я пытаюсь использовать свойство 'ConcurrencyCheck' типа' byte [] ', не будет добавлено в' ModelState'. Угадай, что? Он объявляется в интерфейсе и затем объявляется на каждом объекте «POCO». Мне нужно создать 'ViewModels'. Другого пути нет. Я думаю, что «ViewModel» - это путь. Больше кода на пути ...: D В любом случае вы сделали какой-то тяжелый рабочий код! Congrats ... –