Игнорирование свойств при сериализации - PullRequest
3 голосов
/ 15 февраля 2012

Я вытаскиваю свои волосы на этом.

Я пытаюсь реализовать многошаговый мастер, и я использую помощник Html.Serialize html в MVC3 Futures. Это хорошо работает, за исключением того, что одно из свойств в моей модели - SelectList. Я не хочу, чтобы это свойство сериализовалось (и оно в любом случае взрывается).

Я не могу использовать [NonSerialized], потому что это работает только с полями, а не со свойствами. Я даже попробовал некоторые другие нормальные способы, такие как [XmlIgnore] (который я не думал, что будет работать в любом случае).

Может кто-нибудь предложить атрибут, который будет игнорировать свойство в модели при использовании Html.Serialize?

EDIT:

Ошибка, которую я получаю при попытке сериализации, - это исключение InvalidDataContractException. Есть это сообщение:

Тип 'System.Web.Mvc.SelectList' не может быть сериализован. Попробуйте пометить его атрибутом DataContractAttribute и пометить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute. Если тип является коллекцией, попробуйте пометить его с помощью CollectionDataContractAttribute. См. Документацию Microsoft .NET Framework для других поддерживаемых типов.

Однако, если я сделаю это, мне придется пометить всех членов [DataMember], чтобы исключить 1 свойство, что выглядит глупо.

UPDATE:

Краткий пример этого - фрагмент кода (обязательно добавьте ссылку на 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 Ответ

4 голосов
/ 15 февраля 2012
public class MyViewModel
{
    [IgnoreDataMember]
    public SelectList Items { get; set; }

    ...
}

или просто:

public class MyViewModel
{
    public IEnumerable<SelectListItem> Items { get; set; }

    ...
}
...