2012-02-14 23 views
3

私はこの1つに私の髪を引っ張っています。シリアル化時にプロパティを無視する

私はマルチステップウィザードを実装しようとしており、MVC3 FuturesのHtml.Serialize htmlヘルパーを使用しています。私のモデルのプロパティの1つがSelectListであることを除いて、これはうまくいきます。私はこのプロパティをシリアル化したくありません(とにかくしようとすると爆発します)。

[NonSerialized]は、フィールドでのみ動作し、プロパティでは機能しないため、使用できません。私は[XmlIgnore](私はとにかくうまくいくとは思わなかった)のような他の通常の方法のいくつかを試しました。

Html.Serializeを使用しているモデルのプロパティを無視する属性を提案する人はいますか?

編集:私はシリアル化しようとすると、私が取得

エラーがInvalidDataContractExceptionです。

タイプ 'System.Web.Mvc.SelectList'はシリアル化できません。 DataContractAttribute属性でマークすることを検討し、DataMemberAttribute属性を使用してシリアル化するすべてのメンバにマークを付けます。型がコレクションの場合は、CollectionDataContractAttributeでマーキングすることを検討してください。サポートされている他のタイプについては、Microsoft .NET Frameworkのマニュアルを参照してください。

私はこれを行う場合は、その後、私はちょうど種類の愚かなようだ1つのプロパティを除外する[DataMember]ですべてのメンバーをマークする必要があります。

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]属性を追加することを意味するので、目的が何であるか分かりません。 –

+0

シリアライザがIEnumerablesをデフォルトで無視すると言っていますか? –

+0

@MystereMan、問題は 'SelectList'クラスそのものです。シリアライズできません。 'IEnumerable 'を使うと、そのプロパティは無視されませんが、具体的な型が例えば 'SelectListItem []'や 'List 'のような場合は直列化されます。私は 'IgnoreDataMember'属性をテストして、' SelectList'型で私のために働いていました。問題を再現できるように、ビューモデルの縮小版を表示できますか? –

関連する問題