在编辑页面的 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);
}
我正在尝试修改 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);
}