如何在 MVC 5 实体框架中同时更新多个模型 ASP.NET



我正在尝试同时更新两个模型。

模型:

  1. 领域

一个页面有多个字段,我希望它们同时更新。

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++)
            {

这会将您的列表绑定到模型,同时将数据发送到控制器

最新更新