Kev*_*pan 4 .net c# 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>
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中我得到了这样的东西:
[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--;
Run Code Online (Sandbox Code Playgroud)
InputModel有几个"子模型",如下所示:
public Step1Model Step1 { get; set; }
public Step2Model Step2 { get; set; }
public Step3Model Step3 { get; set; }
Run Code Online (Sandbox Code Playgroud)
将哪些传递给局部视图以填充它们.现在的问题是我总是在我的控制器中的HttpPost中得到一个空模型.我究竟做错了什么?
我究竟做错了什么?
你正在使用部分.部分不尊重导航背景.因此,当您查看生成的HTML源代码时,您将看到以下内容:
<input type="text" name="SomeProperty" value="some value" />
Run Code Online (Sandbox Code Playgroud)
而不是默认模型绑定器所期望的正确的:
<input type="text" name="Step1.SomeProperty" value="some value" />
Run Code Online (Sandbox Code Playgroud)
因此,当您提交此表单时,您没有正确绑定该Step1
属性.对于其他复杂属性,显然也是如此.
一种可能性是使用编辑器模板而不是部分模板,因为它们保留了导航上下文并为输入字段生成专有名称.
所以代替:
Html.RenderPartial("Step1", Model.Step1);
Run Code Online (Sandbox Code Playgroud)
使用:
@Html.EditorFor(x => x.Step1, "Step1")
Run Code Online (Sandbox Code Playgroud)
然后将你的~/Views/SomeController/Step1.cshtml
部分移动到 ~/Views/SomeController/EditorTemlpates/Step1.cshtml
.
如果您不想使用编辑器模板但保留部分,则可以更改部分内的temlpate前缀.因此,例如在Step1.cshtml
partial中,您可以将以下内容放在顶部:
@{
ViewData.TemplateInfo.HtmlFieldPrefix = "Step1";
}
Run Code Online (Sandbox Code Playgroud)
现在,当您检查生成的HTML源时,应为输入字段发出正确的名称.我个人会建议您使用编辑器模板方法,以避免硬编码前缀,并使此部分与编辑器模板相比更不可重复使用.