HttpGet Edit()在视图中编辑的对象不会被HttpPost Edit()接收
本文关键字:Edit 接收 对象 HttpPost 编辑 视图 HttpGet | 更新日期: 2023-09-27 18:05:28
我有两个编辑动作方法,一个用于HttpGet,一个用于HttpPost。HttpGet方法接受一个id参数,检索适当的对象,并显示它以供编辑。HttpPost方法接受一个参数,该参数应该是编辑过的对象;但是,两个id不匹配。为什么会出现这种不匹配?我已经包含了Edit的代码。cshtml视图,以及我的两个动作方法。
The View:
@model WebApplicationPbiBoard.Models.Sprint
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Sprint</legend>
@Html.HiddenFor(model => model.Id)
<div class="editor-label">
@Html.LabelFor(model => model.Start)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Start)
@Html.ValidationMessageFor(model => model.Start)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.End)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.End)
@Html.ValidationMessageFor(model => model.End)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Action Methods:
//
// GET: /Sprint/Edit/5
public ActionResult Edit(int id)
{
var sprint = Db.GetById(id);
return View(sprint);
}
//
// POST: /Sprint/Edit/5
[HttpPost]
public ActionResult Edit(Sprint editedSprint)
{
if (ModelState.IsValid)
{
Db.Save(editedSprint);
return RedirectToAction("Index");
}
else
return View(editedSprint);
}
这是GetById方法。它是NHibernate session的包装器。GetById方法。
public T GetById(int id)
{
return Session.Get<T>(id);
}
这是我的解决方案。感谢所有帮助我调试它的人。
问题是,为了遵循NHibernate的最佳实践,我的id属性的setter是私有的。这意味着控制器不能在重建的模型对象中设置它,所以id是默认值0。为了解决这个问题,我将id作为参数传递给控制器,并在存储库中找到正确的对象,然后手动更新该对象。下面是代码:
[HttpPost]
public ActionResult Edit(int id, DateTime start, DateTime end)
{
//get the right model to edit
var sprintToEdit = Db.GetById(id);
//copy the changed fields
sprintToEdit.Start = start;
sprintToEdit.End = end;
if (ModelState.IsValid)
{
Db.Save(sprintToEdit);
return RedirectToAction("Index");
}
else
return View(sprintToEdit);
}