2012-02-14 112 views
3

我正在拉我的頭髮。序列化時忽略屬性

我想實現一個多步向導,並且我在MVC3期貨中使用了Html.Serialize html helper。這很好,除了我的模型中的一個屬性是SelectList。我不希望這個屬性序列化(當它嘗試時它會炸燬)。

我不能使用[NonSerialized],因爲它只適用於字段,而不適用於屬性。我甚至嘗試了一些其他正常的方式,如[XmlIgnore](我不認爲它會起作用)。

任何人都可以在使用Html.Serialize時提出一個屬性,該屬性將忽略模型中的屬性?

編輯:

我得到的,當我嘗試序列化的錯誤是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]沒有做任何事情無論是。我仍然得到相同的序列化錯誤,可能是因爲該類沒有[DataContract](這是我的猜測)。但是,添加DataContract意味着添加[DataMember]屬性,所以我不確定其用途。 – 2012-02-15 04:54:00

+0

你是說默認情況下序列化器忽略IEnumerables? – 2012-02-15 04:55:01

+0

@MystereMan,問題在於'SelectList'類本身。它不能被序列化。當你使用IEnumerable 時,屬性不會被忽略,但是如果具體類型是例如'SelectListItem []'或者'List ',它將會被序列化。我已經測試了'IgnoreDataMember'屬性,它適用於我的'SelectList'類型。你能否展示一個縮小版本的視圖模型來重現問題? – 2012-02-15 06:32:35