2011-12-15 67 views
1

信息,我有一個很大的對象,我使出使用@Html.Serialize()序列化:TryUpdateModel包含列表的模型去除模型

[Serializable] 
public class ModelB 
{ 
    public List<ModelA> ListOfModelA { get; set; } 
    // more stuff 
} 

該對象包含從包含幾個屬性的類對象的列表。其中一些我包括他們在我看來,而其他人我甚至懶得把他們作爲隱藏的領域,因爲我有他們在我的序列化模型。

[Serializable] 
public class ModelA 
{ 
    public string StringA { get; set; } 
    public string StringB { get; set; } 
    // more stuff 
    public string HiddenStringA { get; set; } 
    public string HiddenStringB { get; set; } 
    // more stuff 
} 

現在,當我回來後與我的變更形式我reconstract我的模型,然後我用從形式獲得的值的字典更新。

[HttpPost] 
public ActionResult Edit([Deserialize] ModelTwo model, 
         FormCollection form) 
{ 
    TryUpdateModel(model, form.ToValueProvider()); 

    // more stuff 
} 

我踩在我的代碼,我做了更新之前,我看到我的反序列化的模型包含一個列表ListOfModelA,裏面包含了應該在那裏的所有元素,並在他們,我可以看到所有的HiddenStringA和HiddenStringB屬性。然後我偷看形式裏面,我看到這樣的與鍵的字典:

ListOfModelA[0].StringA 
ListOfModelA[0].StringB 
ListOfModelA[1].StringB 
ListOfModelA[1].StringB 

同時也有針對性質的這樣一個休息NO鍵:

ListOfModelA[0].HiddenStringA 

接下來,我動一個更進一步,我讓代碼執行TryUpdateModel。現在,查看ListOfModelA屬性的內部,所有元素都被替換爲所有隱藏值爲空的新元素。這就好像更新重建了整個元素(只有有限的信息),而不是隻更新其擁有信息的屬性。

這是預期的行爲?有沒有辦法保持我的模型,並只更新字典中有鍵的屬性?

感謝,

帕諾斯

回答

0

我的問題比上述的一個更復雜的,但我發現的具體設計solultion是大致如下。我將模型的一部分作爲列表序列化,並通過動作的參數綁定整個模型。這樣我就可以避免使用TryUpdateModel,儘管這不是導致我麻煩的原因。然後,我從表單創建的模型中將非空值插入到反序列化模型中,最後我將後者的相應部分指向前者。

[HttpPost] 
public ActionResult Edit(ModelTwo model, 
         [Deserialize] List<ModelA> serializedList) 
{ 
    serializedList.InjectFrom<NonNullLoopValueInjection>(model.ListOfModelA); 
    model.ListOfModelA = serializedList; 

    // more stuff 
} 

對於注射,我用Value Injecter其中NonNullLoopValueInection定義如下

public class NonNullLoopValueInjection : LoopValueInjection 
{ 
    protected override bool AllowSetValue(object value) 
    { 
     return value != null; 
    } 
} 

也許不是最好的設計,但它的工作,它可能會導致我更好的東西。任何反饋都是值得歡迎的。