为了说明我面临的问题,我整理了三个简单的数据模型:
public class PersonalModel {
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class AddressModel {
public string Street { get; set; }
}
public class OverallModel {
public string Id { get; set; }
public PersonalModel Personal { get; set; }
public AddressModel Address { get; set; }
}
这是我简单的Index.chtml:
@model WebAppTest.Models.OverallModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>OverallModel</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.Id)
<div>
@Html.Partial("Personal", Model.Personal)
</div>
<div>
@Html.Partial("Address", Model.Address)
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
}
当&#34; Save&#34;单击按钮,将调用以下控制器方法:
[HttpPost]
public ActionResult Index(OverallModel model) {
return View(model);
}
我遇到的问题是model.Personal
和model.Address
值在控制器方法中始终显示为null。
虽然这些值正确传递给局部视图,但是当单击提交时,Razor引擎无法将整个对象重新组合在一起。
如果你能告诉我我失踪的是什么,我将不胜感激。问候。
答案 0 :(得分:8)
将OverallModel
传递给您的部分,以便正确命名控件以便回发到OverallModel
。目前,您将拥有name="FirstName"
的控件,但它们必须为name="Personal.FirstName"
@Html.Partial("Personal", Model)
并将部分更改为适合
@model OverallModel
....
@Html.TextBoxFor(m => m.Personal.FirstName)
作为替代方案,您也可以将前缀传递给部分
@Html.Partial("Address", Model.Personal, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Personal" }})
答案 1 :(得分:0)
我遇到了和你一样的问题,所以我会把这2美分放在这里给同样的问题。
我的解决方案是使用EditorTemplates。
你创建模型又名个人,地址,总体。
在(放置任何名称)控制器中,您可以创建Overal模型的实例,并在Get方法中将其发送到View中,在Post方法中将其作为传入参数。
public ActionResult Index()
{
var model = new OveralModel();
return View(model);
}
[HttpPost]
public ActionResult Index(OveralModel model)
{
return View(model);
}
索引页面(我会用你的)看起来像这样
@model EditorFor.Models.OveralModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>OverallModel</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(m => m.Id)
<div>
@Html.EditorFor(m => m.Personal)
</div>
<div>
@Html.EditorFor(m => m.Address)
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
}
除了PartialViews我们可以使用EditorModels,我将它理解为PartialView,我们可以随时使用它作为编辑器。
因此,要使用它,我们在Views / Shared中创建名为EditorTemplates的文件夹,并创建与模型同名的视图。
例如,我们的PersonalModel的EditorTemplate将被称为PersonalModel.cshtml,其中的代码可能看起来像这样
@model EditorFor.Models.PersonelModel
<div class="form-group">
@Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })
</div>
</div>
因此,当我们在我们的帖子中写@Html.EditorFor(m => m.Personal)
时,它会查看EditorTemplates并搜索具有相同名称的EditorTemplate并在网站中使用它。
Index site will look like this
当您单击“提交”按钮时,它会将整个模型发送回Controller
Looks like it worked and we got our data back from view and use it for whatever we want to.
PS:我的第一篇文章,所以我希望它是可以理解的,即使现在和将来都会对其他人有所帮助。祝你有个美好的一天