2012-11-23 14 views
9

我有一種感覺,這可能是一個基本的問題!如何在視圖中保留複雜的對象,同時只更新一小部分

我有一個複雜的對象,即包含其他對象列表的屬性的文檔對象。它是通過反序列化一些XML而創建的。

我想整個模型傳遞給視圖

Return ViewResult(MyDoc) 

在查看某些屬性進行編輯。控制然後返回到郵政控制器:

 [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(Document myDoc) 

「myDoc」現在只是表示我的窗體的字段。我懷疑這是ModelBinding的工作。所以我想我需要將我的複雜對象保存在一個隱藏的字段中(示例很棒)或作爲會話對象。然而,我有點困惑如何我的更新字段合併回持久對象(隱藏或會話)。

回答

3

你說得對,這是工作中的模型綁定。

當您使用HtmlHelpers如的結合幾乎發生自動:

@Html.TextboxFor(model => model.PropertyName) 

此行實際上創造的東西有點像這樣:

<input type="textbox" id="Modelobject_PropertyName" name="ModelObject.PropertyName" /> 

然後當您提交表單,該DefaultModelBinder能夠反序列化POST值並創建給定類型的對象(至少它會嘗試),如果找不到相應的條目,則該屬性將爲空,如果條目沒有相應的屬性,則它將是忽略(除非喲你有其他參數)。

您可以閱讀這article它有點舊,但它仍然相當準確。

作爲爲例:

比方說,你有一個簡單的目標:

public class IndexModel 
{ 
    public string MyProperty { get; set; } 
    public bool MyCheckbox { get; set; } 
} 

一個簡單的CONTROLER:

public class TestingController : Controller 
{ 
    [OutputCache(Duration=0, NoStore = true)] 
    public ActionResult Index() 
    { 
     return View(new IndexModel { MyProperty = "hi" }); 
    } 

    [HttpPost] 
    [OutputCache(Duration=0, NoStore = true)] 
    public ActionResult Index(IndexModel model) 
    { 
     model.MyProperty += "!"; 
     ModelState.Clear(); 
     return View(model); 
    } 
} 

和一個簡單的觀點:

@model MvcApp.Models.IndexModel 

@using (Html.BeginForm()) 
{ 
    <div> 
     @Html.LabelFor(model => model.MyProperty)<p /> 
     @Html.TextBoxFor(model => model.MyProperty) 
    </div> 
    <div> 
     @Html.LabelFor(model => model.MyCheckbox)<p /> 
     @Html.CheckBoxFor(model => model.MyCheckbox) 
    </div> 

    <input type="submit" /> 
} 

你會看到,當你提交表格,模型完全重新創建。

如果你不想顯示屬性的實際值,但仍需要它堅持:

@Html.HiddenFor(model => model.MyProperty) 

這將產生將被調回隱藏字段和,爲此,堅持。

快樂編碼!

+1

嗨Lostdreamer,一個最全面和有益的答覆。我同意這是我需要去的方式,以及我之前對巴勃羅說的評論。我想標記兩個答案同樣有用。不知道我是否可以做到這一點。再次抱抱感謝。埃德 – EdB

5

是否將該大對象存儲在視圖中完全有必要?

View似乎無法控制該內容,因此您可能不希望將所有數據發送到View。看起來你正在應用一個基於ViewState的思維模式,這與MVC,恕我直言並不相符。

ViewController之間的通信是通過ViewModels完成的,通常不需要存儲任何大型的序列化數據,並在與服務器交互時使其來回傳送。

你能不能創造一個ViewModel僅表示該視圖的有用數據(場),並通過接收POST期間ViewModel獲得這些數據回到你Action,事後同步從視圖中獲得的信息只有當你從你的XML加載什麼?

+0

巴勃羅,你是對的。我現在已經創建了一個視圖模型,這很好。我現在只需要制定一個創建/維護所有ViewModel的好方法,因爲在一個Document Model上會有很多。不過,我想它也會爲我提供一個額外的驗證層(通過註釋),我懷疑它的性能優勢,因爲我們只是移動ViewModels。但是,我仍然需要通過會話保持文檔模型,或者每次需要時將其反序列化。但這是基於服務器的,因此比網絡更可控。謝謝。編輯 – EdB

+2

嗨巴勃羅,兩個答案是正確的,因爲我的不同原因,但我不能兩個都勾選。不過,我已經標記了。非常感謝。編輯 – EdB

+0

非常好,謝謝:) –

相關問題