如何在ASP.NET MVC 5实体框架中同时更新多个模型
我想在同一时间更新两个模型。如何在ASP.NET MVC 5实体框架中同时更新多个模型
型号:
- 页
- 场
一个网页上有多个领域,我希望他们能够在同一时间更新。
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();
当我发送数据从景观到控制器,我得到的页面数据,但是空的字段模型(对象引用未设置为实例...)。
我期待着来自会员的任何指导。
谢谢。
您需要更换@foreach环路上查看
@foreach (var field in Model.ContentFields)
{
通过对循环
@for (var i = 0; i < Model.ContentFields.Count; i++)
{
这将绑定你的列表模式,而将数据发送到控制器
谢谢,它为我工作。 – Aleem
我觉得Umesh制作答案是正确的。 改变你的循环后,你如何设置你的Html.TextBoxFor,HiddenFor等?
它应该是:
@Html.HiddenFor(m => m.ContentFields[i].Id)
如果你愿意,我在我的博客中有一篇关于这个的文章:) http://debuxing.com/model-binding-to-a-list-of-objects/ –
非常感谢,它为我工作。 您的博客非常棒。 :) – Aleem
非常感谢@Aleem很高兴你喜欢它,它的工作。 –
有相当相似类型的问题在这里找到:https://stackoverflow.com/questions/18237945/how-to-edit-save-viewmodels-data-back-to - 数据库 – jyrkim
@GertArnold让我在这里添加更多的代码。 – Aleem
@GertArnold我已经更新了这个问题,请看看。 – Aleem