我正在尝试同时更新两个模型。
模型:
- 页
- 领域
一个页面有多个字段,我希望它们同时更新。
public class PageEditViewModel
{
public Page mPage { get; set; }
public IEnumerable<Field> Fields { get; set; }
}
以下是我的观点:
<div class="row">
<div class="col-md-12">
<h3>Fields</h3>
@foreach (var field in Model.ContentFields)
{
@Html.HiddenFor(m => field.Id)
switch (field.FieldType)
{
case "TextBox":
<div class="form-group">
<label class="control-label">
@field.FieldName<span class="required"> * </span>
</label>
@Html.TextBoxFor(m => field.Content , new { @class = "form-control" })
</div>
break;
case "TextArea":
<div class="form-group">
<label class="control-label">
@field.FieldName<span class="required"> * </span>
</label>
@Html.TextAreaFor(m => field.Content, new { @class = "form-control" })
</div>
break;
case "Image":
<div class="form-group">
<label class="control-label">
@field.FieldName<span class="required"> * </span>
</label>
<input type="file" name="contentImage" id="cImage" class="form-control" accept="image/*" />
</div>
break;
}
}
</div>
</div>
和控制器:
public ActionResult Update(PageEditViewModel viewModel)
{
if (!ModelState.IsValid)
{
var page = _context.MenuPages.Single(s => s.Id == viewModel.mPage.Id);
var contentFields = _context.ContentFields.Where(c => c.MenuPageId == page.Id);
var viewM = new PageEditViewModel
{
DashboardHeading = "Edit a Page",
mPage = page,
ContentFields = contentFields
};
return View("EditPage", viewM);
}
var pageEdit = _context.MenuPages.SingleOrDefault(p => p.Id == viewModel.mPage.Id);
pageEdit.Name = viewModel.mPage.Name;
pageEdit.IsActive = viewModel.mPage.IsActive;
pageEdit.IsShowInMenu = viewModel.mPage.IsShowInMenu;
// _context.SaveChanges();
foreach (var field in viewModel.ContentFields)
{
var cfield = _context.ContentFields.SingleOrDefault(f => f.Id == field.Id);
cfield.Content = field.Content;
}
_context.SaveChanges();
当我将数据从视图发送到控制器时,我获得了页面的数据,但字段模型的数据为 null(对象引用未设置为实例......
我期待着各位成员的任何指导。
谢谢。
我认为Umesh的答案是正确的。更改循环后,您如何设置Html.TextBoxFor,HiddenFor等?
它应该是:
@Html.HiddenFor(m => m.ContentFields[i].Id)
您需要
替换视图@foreach循环
@foreach (var field in Model.ContentFields)
{
通过 for 循环
@for (var i = 0; i < Model.ContentFields.Count; i++)
{
这会将您的列表绑定到模型,同时将数据发送到控制器