2010-10-21 43 views
0

我具有被嵌套在其它視圖模型的模型綁定模型返回時用DisplayFor模板顯示

public class PersonViewModel 
{ 
    public Guid Id { get; set; } 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
} 

public class ApprovalModel 
{ 
    [UIHint("MyDisplayTemplate")] 
    public PersonViewModel User { get; set; } 

    [Required] 
    public bool? Approve { get; set; } 
} 

在視圖 - >共享 - > DisplayTemplates我有模板MyDisplayTemplate.ascx

在我看來ApprovalModel視圖我使用以下行,它顯示嵌套模型:

<div class="display-field"> <%: Html.DisplayFor(model => model.User) %> </div> 

在我控制我的行動

[HttpPost] 
public virtual ActionResult ApproveRequest(ApprovalModel vm) 
{ 
    //access bound vm.User here 
} 

是否有嵌套模型綁定回來後要求一個簡單的方法?或者我還能做些什麼來綁定它?

感謝

回答

2

在會話中保存您的視圖模型並將該ID作爲隱藏字段呈現。然後,您的發佈操作可以從Session中檢索模型,或者在ID不存在的情況下通過ID加載。

查看:

<%: Html.HiddenFor(x => x.Id) %> 

控制器:

[HttpPost] 
public virtual ActionResult ApproveRequest(int id) 
{ 
    //access bound vm.User here 
} 
2

您需要在顯示模板輸入字段:

<%: Html.HiddenFor(x => x.Id) %> 
<%: Html.LabelFor(x => x.Firstname) %> 
<%: Html.TextBoxFor(x => x.Firstname) %> 
<br/> 
<%: Html.LabelFor(x => x.Lastname) %> 
<%: Html.TextBoxFor(x => x.Lastname) %> 

而在你的控制器動作指示用戶前綴,以便模型綁定能夠正確識別請求的值,並結合他們到ApprovalModel

[HttpPost] 
public ActionResult ApproveRequest([Bind(Prefix = "User")] ApprovalModel vm) 

另外編輯模板似乎更爲合適(<%: Html.EditorFor(model => model.User) %>),用於產生形式和輸入字段而不是顯示的模板。

+0

但我不想編輯字段。我想要顯示它們並在後操作中重複使用它們 – Fabiano 2010-10-21 13:46:46

+1

沒有輸入字段,您將不會將值返回到控制器操作中。當您使用'ApprovalModel'作爲操作參數時,它將查找請求中傳遞的值。如果您不希望這些輸入字段可見,但需要以某種方式將值發送到服務器,則還可以將它們作爲隱藏字段包含在表單中。 – 2010-10-21 14:27:10

1

你並不需要把在的Fileds你只需把它放在一些輸入字段的文本框,所以當頁面發回時,這些值被髮送回服務器。因此,只需使用HiddenFor(....)爲每個你想恢復的字段發回