2011-03-04 42 views
41

我有2個型號我的樣本MVC 3應用程序,SimpleModelComplexModel中,如下圖所示:這個模型複雜的模型和局部視圖 - 在模型綁定的問題ASP.NET MVC 3

public class SimpleModel 
{ 
    public string Status { get; set; } 
} 

public class ComplexModel 
{ 
    public ComplexModel() 
    { 
     Simple = new SimpleModel(); 
    } 

    public SimpleModel Simple{ get; set; } 
} 

我已經定義的視圖:

_SimplePartial.cshtml

@model SimpleModel 

@Html.LabelFor(model => model.Status) 
@Html.EditorFor(model => model.Status) 

Complex.cshtml

@model ComplexModel 

@using (Html.BeginForm()) { 

    @Html.Partial("_SimplePartial", Model.Simple) 
    <input type="submit" value="Save" /> 
} 

提交表單後,在Status字段中輸入隨機值,該值不綁定到我的模型。該StatusNULL當我檢查模型在我的控制器動作:

[HttpPost] 
public ActionResult Complex(ComplexModel model) 
{ 
    // model.Simple.Status is NULL, why ? 
} 

爲什麼不綁定?我不想繼承模型。我是否必須爲這種簡單情況編寫自定義模型綁定器?

問候。

+0

可以做到這一點,但也許鑄造的簡單對象到東西,所以所有的字段AREN不可編輯? – icecreamsoop 2012-03-01 15:21:14

回答

59

相反的:

@Html.Partial("_SimplePartial", Model.Simple) 

我會使用編輯器模板建議您:

@model ComplexModel 
@using (Html.BeginForm()) 
{ 
    @Html.EditorFor(x => x.Simple) 
    <input type="submit" value="Save" /> 
} 

,然後把簡單部分內~/Views/Shared/EditorTemplates/SimpleModel.cshtml或內部~/Views/Home/EditorTemplates/SimpleModel.cshtml其中Home是你的控制器的名稱:

@model SimpleModel 
@Html.LabelFor(model => model.Status) 
@Html.EditorFor(model => model.Status) 

當然,如果你喜歡有部分在一些特殊的位置,而不是遵守的規則(爲什麼你會嗎?),你可以指定位置:

@Html.EditorFor(x => x.Simple, "~/Views/SomeUnexpectedLocation/_SimplePartial.cshtml") 

然後一切都會到位預期。

+1

+1爲好的答案。 – Chev 2011-03-04 17:32:23

+1

看起來不錯,但有一個缺點。狀態字段的id屬性已從「狀態」更改爲「Simple_Status」。正因爲如此,我的JavaScript停止工作。有什麼辦法可以告訴MVC不要更改默認的元素ID嗎?由於我不會使用同一個模型包含多個視圖,因此這個ID將始終是唯一的。不過,mabye更正確的方法是修復js? – jwaliszko 2011-03-04 20:27:29

+1

答案很有幫助。但@ Html.EditorFor(x => x.Simple)將顯示SimpleModel Class的所有屬性。但如果我只想顯示幾個屬性,我怎麼能實現它? – 2012-02-15 16:33:26

21

As Daniel Hall suggests in his blog,傳遞ViewDataDictionaryTemplateInfo其中HtmlFieldPrefix設置爲SimpleModel屬性的名稱:

@Html.Partial("_SimplePartial", Model.Simple, new ViewDataDictionary(ViewData) 
    { 
     TemplateInfo = new System.Web.Mvc.TemplateInfo 
     { 
      HtmlFieldPrefix = "Simple" 
     } 
    }) 
+1

公共靜態的ViewDataDictionary WithFieldPrefix (此的ViewDataDictionary 可視數據,串fieldPrefix) { 返回新的ViewDataDictionary (可視數據) { TemplateInfo =新TemplateInfo { HtmlFieldPrefix = fieldPrefix } }; } – 2015-02-05 20:25:56

+1

這個答案應該有更多的票! – 2015-04-07 09:53:04

+1

我喜歡這個回答。因爲大多數時候我需要在複雜模型中使用部分。 – kartal 2015-09-14 17:12:26