2012-05-10 26 views
4

我有一個索引視圖,我得到了一個包含不同公式視圖的表單。模型沒有在ASP.NET MVC 3中傳遞

@Html.ValidationSummary(true, "Beheben Sie die Fehler, und wiederholen Sie den Vorgang.") 
@using (Html.BeginForm()) 
{ 
object mod = null; 
switch (Model.Step) 
{ 
    case 1: 
     Html.RenderPartial("Step1", Model.Step1); 
     break; 
    case 2: 
     Html.RenderPartial("Step2", Model.Step2); 
     break; 
    default: 
     Html.RenderPartial("Step0"); 
     break; 
} 

<p> 
    @if (Model.Step > 100000) 
    { 
     <button name="button" value="Zurück" /> 
    } 
    @if (Model.Step != 0) 
    {  
     <input type="submit" name="submit" value="Zurück" /> <input type="submit" name="submit" 
      value="Weiter" id="Weiter" /> <input type="submit" name="submit" value="Abbrechen" /> 
    } 
</p> 
} 

在我的控制器我有這樣的事情:

[HttpPost] 
public ActionResult Index(InputModel model, string submit, HttpPostedFileBase file) 
{ 
    if (String.IsNullOrEmpty(submit)) 
     submit = ""; 
    if (submit == "Weiter") 
     model.Step++; 

    if (submit == "Zurück") 
     model.Step--; 

的InputModel有幾個「子模型」是這樣的:

public Step1Model Step1 { get; set; } 

public Step2Model Step2 { get; set; } 

public Step3Model Step3 { get; set; } 

被傳遞給局部圖,其填充它們。 現在的問題是,我總是在我的控制器中獲得HttpPost中的空模型。 我在做什麼錯?

+1

查看生成的html代碼的輸入框的名稱。他們應該是錯的。你的行爲期望像「Step1Model_Property」。更多詳細信息如何獲得正確的名稱看http://msdn.microsoft.com/en-us/library/ee407414.aspx – ChrisB

+0

我同意@ChrisB - 你應該使用'Html.EditorFor(Model.Step1)'然後爲「Step1Model」等添加編輯器模板 - 這將處理命名;如果您使用的是「RenderPartial」,則很難傳輸MVC所需的元數據以保持輸入的正確命名 –

回答

7

我在做什麼錯?

您正在使用partials。部分不尊重導航上下文。所以,當你看看你生成的HTML源,您將看到以下內容:

<input type="text" name="SomeProperty" value="some value" /> 

而不是正確的一個是由默認的模型綁定預期:

<input type="text" name="Step1.SomeProperty" value="some value" /> 

所以,當你提交此表,您沒有正確綁定到Step1屬性。對於其他複雜的屬性也同樣重要。

一種可能性是使用編輯器模板而不是部分,因爲它們保留了導航上下文併爲輸入字段生成專有名稱。

所以不是:

Html.RenderPartial("Step1", Model.Step1); 

使用:

@Html.EditorFor(x => x.Step1, "Step1") 

然後移動~/Views/SomeController/Step1.cshtml~/Views/SomeController/EditorTemlpates/Step1.cshtml

如果你不想使用編輯器模板,但保留部分,你可以改變部分內部的模板前綴。當您檢查您生成的HTML源適當的名稱應射出的輸入字段

@{ 
    ViewData.TemplateInfo.HtmlFieldPrefix = "Step1"; 
} 

現在:因此,例如內部Step1.cshtml部分你可以把在頂部以下。就我個人而言,我會建議您使用編輯器模板方法,以避免對前綴進行硬編碼,並使得與編輯器模板相比,這種部分的重用性更低。

+0

謝謝,幫了大忙! –