ASP.NET MVC 3中未传递模型

4

我有一个索引视图,其中包含一个表单,该表单包含不同表格的部分视图。

@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--;

输入模型有几个“子模型”,就像这样:
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
我同意@ChrisB的观点 - 你应该使用Html.EditorFor(Model.Step1),然后为Step1Model等添加编辑器模板 - 这将处理命名问题;如果你正在使用RenderPartial,那么很难传输MVC所需的元数据以保持输入名称的正确性。 - Andras Zoltan
1个回答

7

我哪里做错了?

你在使用局部视图。局部视图不会考虑导航上下文。因此,当你查看生成的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

如果您不想使用编辑器模板而保留局部视图,您可以在局部视图内更改模板前缀。例如,在Step1.cshtml局部视图中,您可以在顶部放置以下内容:

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

现在当你检查你生成的 HTML 源代码时,应该为输入字段发出适当的名称。个人建议您使用编辑器模板方法,以避免硬编码前缀并使这个部分相对于编辑器模板更少可重用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接