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

InputModel 有几个像这样的“子模型”:

public Step1Model Step1 { get; set; }

public Step2Model Step2 { get; set; }

public Step3Model Step3 { get; set; }

将其传递给局部视图以填充它们。现在的问题是我的控制器中的 HttpPost 中总是有一个空模型。我究竟做错了什么?

4

1 回答 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 源代码时,应该为输入字段发出正确的名称。就我个人而言,我会推荐你​​使用编辑器模板方法,以避免硬编码前缀并使这部分与编辑器模板相比可重用性降低。

于 2012-05-10T08:26:35.047 回答