2012-02-14 4 views
3

Я вытягиваю свои волосы на этом.Игнорирование свойств при сериализации

Я пытаюсь реализовать многоэтапный мастер, и я использую html-помощник Html.Serialize в фьючерсах MVC3. Это хорошо работает, за исключением одного из свойств моей модели: 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

ответ

4
public class MyViewModel 
{ 
    [IgnoreDataMember] 
    public SelectList Items { get; set; } 

    ... 
} 

или просто:

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

    ... 
} 
+0

[IgnoreDataMember] не делает ничего, либо. Я все равно получаю ту же ошибку Serialization, вероятно, потому, что в классе нет [DataContract] (это мое предположение). Тем не менее, добавление DataContract означает добавление атрибутов [DataMember], поэтому я не уверен, что это за цель. –

+0

Вы говорите, что сериализатор игнорирует IEnumerables по умолчанию? –

+0

@MystereMan, проблема связана с самим классом 'SelectList'. Он не может быть сериализован. Когда вы используете 'IEnumerable ', свойство не игнорируется, но оно будет сериализоваться, если конкретным типом является, например, 'SelectListItem []' или 'List '. Я тестировал атрибут 'IgnoreDataMember', и он работал для меня с типом' SelectList'. Не могли бы вы показать суженную версию вашей модели просмотра, позволяющую воспроизвести проблему? –