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);
        }

HttpGet Edit()在视图中编辑的对象不会被HttpPost Edit()接收

这是我的解决方案。感谢所有帮助我调试它的人。

问题是,为了遵循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);
}