2012-05-15 71 views
31

我目前正在嘗試發佈由兩個強類型視圖組成的表單。這個問題是相似的,但它沒有一個答案:發表包含多個部分視圖的表格

MVC 3 Razor Form Post w/ Multiple Strongly Typed Partial Views Not Binding

當我提交表單提交給控制器模型總是空。我花了幾個小時試圖讓這個工作。這看起來應該很簡單。我在這裏錯過了什麼嗎?我不需要做阿賈克斯只需要能夠發佈到控制器並呈現新的頁面。

感謝

這裏是我的視圖代碼:

<div> 
    @using (Html.BeginForm("TransactionReport", "Reports", FormMethod.Post, new {id="report_request"})) 
    { 
     ViewContext.FormContext.ValidationSummaryId = "valSumId"; 
     @Html.ValidationSummary(false, "Please fix these error(s) and try again.", new Dictionary<string, object> { { "id", "valSumId" } }); 
     @Html.Partial("_ReportOptions", Model.ReportOptions); 
     @Html.Partial("_TransactionSearchFields", new ViewDataDictionary(viewData) { Model = Model.SearchCriteria }); 
    } 

這裏的控制器代碼:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult TransactionReport(TransactionReportRequest reportRequest) 
{ 
    var reportInfo = new List<TransactionReportItem>(); 

    if (ModelState.IsValid) 
    { 
     var reportData = _reportDataService.GetReportData(Search.MapToDomainSearchCriteria(reportRequest.SearchCriteria)); 
     if (reportData!=null) 
     { 
      reportInfo = reportData.ToList(); 
     } 
     return View(reportInfo); 
    } 
    return View(reportInfo); 
} 

,因爲所有這些都是局部的觀點本身是相當無關這樣做是爲了展示他們的模型。

+0

哪裏是你的提交按鈕?它需要在Form標籤內。不知道你是否沒有包含它或者它是否在標籤之外 –

回答

49

部分是不是去這裏的路。你正在尋找EditorTemplates,這些是爲你想要的。這種情況下,您的屬性將很好地綁定到您的模型(您將提交)。

主視圖中都會有這樣的形式(請注意,您只需要使用EditorFor代替Partial;在這種情況下,你可能需要把該可視數據參數在ViewBag左右):

@using (Html.BeginForm("TransactionReport", "Reports", FormMethod.Post, new {id="report_request"})) 
{ 
    ViewContext.FormContext.ValidationSummaryId = "valSumId"; 
    @Html.ValidationSummary(false, "Please fix these error(s) and try again.", new Dictionary<string, object> { { "id", "valSumId" } }); 
    @Html.EditorFor(model => model.ReportOptions); 
    @Html.EditorFor(model = Model.SearchCriteria }); 
} 

現在只需將部分拖動到文件夾~/Shared/EditorTemplates/並將其重命名爲與它們的編輯器模板的型號名稱相匹配。

~/Shared/EditorTemplates/文件夾中,創建一個新的「視圖」,例如「SearchCriteria.cshtml」。在裏面,把「模型」作爲你創建編輯器模板的類型。實施例(實施例類具有NameOtherCriteria):

@model MyNamespace.SearchCriteria 
<ul> 
    <!-- Note that I also use EditorFor for the properties; this way you can "nest" editor templates or create custom editor templates for system types (like DateTime or String or ...). --> 
    <li>@Html.LabelFor(m => m.Name): @Html.EditorFor(m => m.Name)</li> 
    <li>@Html.LabelFor(m => OtherCriteria): @Html.EditorFor(m => m.OtherCriteria</li> 
</ul> 

一些良好的閱讀關於他們:

+1

是的,這是一個更好的解決方案。 Grails有一些類似的東西,我應該用grails的詞彙來搜索(我的意思是用binged):)這很好用!謝謝您的幫助! – Buzzer

+4

當你不知道某種技術中的正確術語時,有時候很難找到一些東西。 – Styxxy

+0

大聲笑...那是真的。再次感謝! – Buzzer

10

我同意@Styxxy和@Tony,編輯模板是更好的解決方案。但是,您的問題是您要將子模型提供給部分視圖。因此,當局部視圖呈現時,它不知道它是更大模型的一部分,並且不會生成正確的名稱屬性。

如果你堅持使用Partials而不是Editor Templates,那麼我建議只將Model傳遞給partials,然後讓每個partial都做Model.Whatever.Foo,它會爲綁定生成正確的名稱屬性。

9

您應該爲PartialView的字段添加前綴。這會讓綁定數據正確。

所以不是:

@Html.Partial("_ReportOptions", Model.ReportOptions); 

用途:

@Html.Partial("_ReportOptions", Model.ReportOptions, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ReportOptions" }}) 
1
@Html.Partial("_ReportOptions", Model.Contact, new ViewDataDictionary() 
      { 
       TemplateInfo = new TemplateInfo() 
        { 
         HtmlFieldPrefix = "Contact" 
        } 
      }) 

) 


@Html.Partial("_TransactionSearchFields", Model.SearchCriteria, new 
ViewDataDictionary() 
      { 
       TemplateInfo = new TemplateInfo() 
        { 
         HtmlFieldPrefix = "SearchCriteria" 
        } 
      }) 
相關問題