Игнорирование свойств при сериализации
Я вытаскиваю свои волосы на этом.
Я пытаюсь реализовать многошаговый мастер, и я использую Html.Serialize
HTML помощник в фьючерсах MVC3. Это работает хорошо, за исключением одного из свойств в моей модели SelectList
, Я не хочу, чтобы это свойство сериализовалось (и оно взрывается, когда все равно пытается).
Я не могу использовать [NonSerialized]
потому что это работает только на полях, а не свойства. Я даже попробовал некоторые другие нормальные способы, такие как [XmlIgnore]
(который я не думал, будет работать в любом случае).
Может кто-нибудь предложить атрибут, который будет игнорировать свойство в модели при использовании Html.Serialize
?
РЕДАКТИРОВАТЬ:
Ошибка, которую я получаю при попытке сериализации, - это InvalidDataContractException. Есть это сообщение:
Тип 'System.Web.Mvc.SelectList' не может быть сериализован. Попробуйте пометить его атрибутом DataContractAttribute и пометить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute. Если тип является коллекцией, попробуйте пометить его с помощью CollectionDataContractAttribute. См. Документацию Microsoft .NET Framework для других поддерживаемых типов.
Однако, если я сделаю это, я должен отметить всех участников [DataMember]
просто чтобы исключить 1 свойство, которое кажется глупым.
ОБНОВИТЬ:
Быстрый пример этого - этот фрагмент кода (обязательно добавьте ссылку на System.Runtime.Serialization.dll):
Test.cs
[Serializable]
public class Test
{
public int ID { get; set; }
[IgnoreDataMember]
public SelectList TestList { get; set; }
}
HomeController.cs
public ActionResult About()
{
return View(new Test() { ID = 0, TestList = new SelectList(new [] {""})});
}
Главная /About.cshtml
@using Microsoft.Web.Mvc
@model MvcApplication3.Models.Test
@Html.Serialize("Test", Model)
Это генерирует InvalidDataContractException
1 ответ
public class MyViewModel
{
[IgnoreDataMember]
public SelectList Items { get; set; }
...
}
или просто:
public class MyViewModel
{
public IEnumerable<SelectListItem> Items { get; set; }
...
}