在编辑页面的 Post 方法中处理视图模型

Handling View Model in Post Method of Edit page

我正在尝试修改 activity 编辑页面,以便我可以涉及更多信息。 为了简化,我有以下内容。

型号

public class Activity
{
    public int ActNo { get; set; }
    public string ActName { get; set; }
    public virtual ICollection<Attendance> Attendances { get; set; }
}

public class Attendance
{
    public int ActNo { get; set; }
    public string StudentID { get; set; }
    public virtual Activity Activities { get; set; }
    public virtual Student Students { get; set; }
}
public class Student
{
    public string StudentID { get; set; }
    public string EnglishName { get; set; }
    public virtual ICollection<Attendance> Attendances { get; set; }
}

在编辑页面,我也想显示学生信息(包括那些在考勤中没有相关记录的)。所以我有一个 ViewModel。

public class ActivityEditView
{
    public Activity SelectedActivity { get; set; }
    public Student Students { get; set; }
}

查看

@model <projectname>.ViewModels.ActivityEditView
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.SelectedActivity.ActNo)

        <div class="form-group">
            @Html.LabelFor(model => model.SelectedActivity.ActName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.SelectedActivity.ActName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.SelectedActivity.ActName, "", new { @class = "text-danger" })
            </div>
        </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>

我将 model.ActNo 和 model.ActName 更改为 model.SelectedActivity.ActNo 和 model.SelectedActivity.ActName

控制器

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "ActNo,ActName")] Activity activity)
    {
        if (ModelState.IsValid)
        {
            db.Entry(activity).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(activity);
    }

现在一切都显示正确,但我无法更新信息。 db.SaveChanges() 处发生错误。

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。

我不知道如何更新控制器部分的代码。有什么想法吗?

您可能绑定到 null。尝试:

[Bind(Prefix = "SelectedActivity")]Activity activity

您需要修改您的 class (Activity) 以指定可绑定属性如下:

[Bind(Include = "ActNo,ActName")]
public class Activity
{
    public int ActNo { get; set; }
    public string ActName { get; set; }
    public virtual ICollection<Attendance> Attendances { get; set; }
}

然后在您的 POST 操作中,您需要传递类型为 (ActivityEditView):

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(ActivityEditView activityEdit)
    {
        if (ModelState.IsValid)
        {
            db.Entry(activityEdit.SelectedActivity).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(activity);
    }