2012-02-14 108 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

相关问题