2013-08-24 41 views
9

我是新來的MVC 4和剃鬚刀。我有一個包含多個部分視圖的視圖。由於部分視圖的功能,我打算在其他視圖中重用這些視圖。MVC 4剃刀,張貼部分視圖形式

我的模型是複雜對象的集合e.g:

public class EmployeeInfo 
    { 
     public EmployeeContactInfo contactInfo { get; set; } 
     public List<TelephoneInfo> phoneDetails { get; set; } 
     public AddressDetails addressDetails { get; set; } 
    } 

我的主視圖模型是EmployeeInfo等局部視圖具有模型作爲TelephoneInfo,分別EmployeeContactInfoAddressDetails

我試着用RenderPartialRenderActionPartial加載我的局部視圖e.g:

@using (Html.BeginForm()) 
    { 
    @Html.Partial("ContactInfo",Model.contactInfo) 
    } 

當主表單提交可是沒有的局部視圖更新的值的主力機型。

我搜索了這一點,並低於2級提出的解決方案中發現:

  1. 使用EditorFor - 它的工作原理和模型被更新,但我不僅文本框,但其中有一些內部操作其他控件(收集像搜索地址),我還需要在其他地方重複使用相同的局部視圖(如經典ASP.NET中的用戶控件)

  2. 使用RenderAction而不是RenderPartial - 它不適用於我。

請讓我知道如果我錯了或錯誤理解任何東西。

+0

這可能幫助:http://stackoverflow.com/questions/7687592/mvc3-partial-view-and-model-not-posting-back-changes –

回答

18

另一種選擇是創建一個editor template。例如,在你的主要觀點:

@using (Html.BeginForm()) 
{ 
    @(Html.EditorFor(m => m.ContactInfo)) 
} 

現在,在您的瀏覽/共享文件夾(或查看/ ControllerName文件夾如查看/家庭),創建一個名爲「EditorTemplates」一個新的文件夾。在該新文件夾中創建一個名爲EmployeeContactInfo.cshtml的cshtml視圖文件(提示,cshtml的名稱應該是數據類型名稱,例如string,bool或者在這種情況下,您的客戶聯繫信息類型)。在該視圖文件,把這樣的:

@model EmployeeContactInfo 

@Html.LabelFor(m => m.Email) 
@Html.TextBoxFor(m => m.Email) 

當你郵寄回控制器,該值將作爲你返回模型的一部分。

+0

@indranilpal - 編輯器模板與部分視圖類似,只不過它們是旨在以您想要使用它們的方式使用(作爲可重用組件)。它允許您根據其類型呈現組件,並使用適當的命名約定來支持複雜的嵌套對象。它也支持對象的集合,並且也會呈現集合。 –

+0

@MystereMan - 的確,我想要一些我可以重複使用的東西,我認爲編輯器模板可以節省我的一天。謝謝JasonEvans和謝謝你MysteryMan :) –

+0

請注意在行尾的分號。實際上,它不需要將字符打印到HTML。謝謝! – Diego

5

問題是您的主窗體期望名稱爲contactInfo.property的元素,可能在您部分生成的名稱是沒有正確標識符的屬性,此問題會爲MVC的默認模型綁定器創建問題。 您可以創建自定義模型聯編程序,但需要付出艱辛的努力,或者您有兩種方法可以用較少的工作來解決您的問題。

1.強制生成的元素

例如名稱,如果你的EmployeeContactInfo類包含你要使用這個幫手字符串Address屬性:

@Html.TextBox("contactInfo.Address", model.Address) 

導致:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" /> 

而不是:

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

導致:

<input type="text" name="Address" id="Address" /> 

2。通過整個模型:

如果傳遞整個模型生成的名稱將是正確的,所以你可以使用助手:

@Html.TextBoxFor(m=> m.contactInfo.Address) 

導致:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" /> 
+0

傳遞整個模型作品,我同意,但爲了在其他地方重新看到視圖,我不希望其他視圖每次都從其實際模型創建新模型和映射。我也想過控制中的「名稱」,但是如果在呈現控件時將它放入htmlAttributes列表中,則該名稱不起作用,名稱將更改回屬性名稱 –

-2

局部視圖頁面的作用類似於用戶控制

  1. 這裏_login.cshtml是局部視圖
  2. 如果您使用的局部視圖,然後下劃線後接名稱:

    <div style = "margin:3%;"> @Html.Partial("~/Views/Shared/_login.cshtml",Model.login)
    </div>

  3. Model.login是一個對象。所以在這個對象中,你可以爲任何頁面賦值。

  4. 部分將基於對象值顯示。

+0

我相信你正在使用來自一個項目的示例代碼,並且原來的代碼不能幫助用戶解決這個特定的問題 – Zac