2013-10-01 58 views
3

期間維持值我有去像MVC模型綁定 - 部分編輯

public class Mod 
{ 
    public string StaticProp1 {get; set;} 
    public string StaticProp2 {get; set;} 

    public string EditableProp1 {get; set;} 
} 

我想,我可以編輯EditableProp1但如果StaticProp1StaticProp2顯示,但不能編輯視圖模型類。

我創建了一個強類型的視圖:

@model Mod 

@using (Html.BeginForm()) 
{ 
    <p>@Model.StaticProp1</p> 
    <p>@Model.StaticProp2</p> 

    @Html.TextBoxFor(m => m.EditableProp1) 

    <input type="submit" value="Save" /> 
} 

在我的控制器,當我處理的動作我覺得EditableProp1罰款。

[HttpPost] 
public ActionResult Edit(Mod model, FormCollection collection) 
{ 
    string editableProp = model.EditableProp1; //This works fine 

    string staticProp1 = model.StaticProp1; //Missing 

    return View(model); 
} 

這會導致一個問題,如果我回來後因某種原因如staticProp1現在將是無效和視圖將無法顯示。

我知道,我可以添加

@Html.HiddenFor(m => m.StaticProp1) 
@Html.HiddenFor(m => m.StaticProp2) 

我的看法,並認爲它會正常工作,但我不知道是否有其他更好的辦法。

我的數值已經在窗體上(<p>@Model.StaticProp1</p>)。有沒有辦法將模型綁定到這樣的不可編輯標籤?有沒有一個HTML助手做這樣的事情?順便說一句,如果它不明顯,我剛剛開始與MVC,所以如果我完全錯過了這一點,請讓我知道!

+0

如果'StaticProp'來自數據庫或東西,你可以再次讀取它們並在回發方法中設置模型數據 – Shoe

+2

爲什麼您要避免使用HiddenFor?這是一個常見的用例。 –

+0

我想避免它,因爲它們中有很多(我的模型比我在這裏展示的更復雜)。它只是覺得他們混淆了這個觀點,而且由於價值觀已經在形式上,我認爲也許還有另一種方式。 有點像@ Html.LiteralFor(...) –

回答

2

您要堅持的模型的每個屬性都必須以表單的形式(在編輯器或隱藏字段中)。正如你所建議的,你可以使用Html.HiddenFor()。如果您想避免使用隱藏字段來重載視圖,則可以只將實體的ID存儲在隱藏字段中,並根據Post操作中的id獲取其餘數據。或者使用Html.TextBoxFor()readonly屬性,請參閱this question瞭解更多信息(我也喜歡第二個答案中的方法)。

+0

我相信禁用屬性會導致該字段不發佈,這是目前他的問題。 readonly屬性是他想要的屬性。 –

+0

這是有道理的,我認爲'只讀'屬性是確實的方式。我添加了一個相關的問題。 –

+1

謝謝,這些批准工作正常。我只是想確保我沒有錯過任何顯而易見的事情,這似乎並非如此。 –

1

我認爲這個問題更多地涉及到模型綁定以及它是如何工作的。如果你不想在這裏使用隱藏域(我認爲適合您的方案),你可以自定義模型綁定通過繼承一個類:

DefaultModelBinder