获取"将 [HttpPost] 添加到编辑方法时找不到资源



我收到的错误消息:

找不到资源。说明:HTTP 404。要查找的资源(或其依赖项之一(可能已被删除、名称已更改或暂时不可用。 请查看以下 URL 并确保拼写正确。

请求的网址:/成员/编辑成员

调用 Edit 方法的操作链接如下所示:

@Html.ActionLink("Rediger", "EditMember", new { item.MemberID }) 

以及表示"编辑成员"页面的视图:

@using (Html.BeginForm("EditMember", "Member", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.MemberID)
<div class="form-group">
@Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.FirstName, "Navn skal angives", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })
</div>
</div
...
}

控制器动作:

[HttpPost]
[ValidateAntiForgeryToken] 
public ActionResult EditMember(Member model)
{
Member members = new Member();
var member = DBContext.Members.Find(model.MemberID);
if (member == null)
{
return HttpNotFound();
}
if(ModelState.IsValid)
{                                
DBContext.SaveChanges();
}
return View(member);
}

我还尝试更改操作方法参数,因此看起来像这样

[HttpPost]
[ValidateAntiForgeryToken] 
public ActionResult EditMember(int? id) { ... }

但错误保持不变。

然而。。。

如果我删除[HttpPost注释,则错误消失,它将找到请求的URL。但它只是不会提交更改并将其保存到数据库中。

也就是说,如果我这样做:

[ValidateAntiForgeryToken] 
public ActionResult EditMember(Member model)

然后,它会查找请求的 URL,但不保存对数据库所做的更改。

我的问题可能是什么?

我怀疑你没有在 HttpGet 方法中传递 Id。这可能是由于使用 ViewModel 显示成员信息。

表中没有具有指定成员 ID 的行。

在你的控制器中,你应该有两个操作(HttpGet 和 HttpPost(

[HttpGet] 
public ActionResult EditMember(int id)
{
var member = db.member..SingleOrDefault(x => x.Id == id);
if (member != null)
{
var memberViewModel = new MemberViewModel();
memberViewModel.MemberID = member.Id;
memberViewModel.FirstName = member.FirstName;
memberViewModel.LastName = member.LastName;
return View(memberViewModel);
}
return View();
}

[HttpPost]
[ValidateAntiForgeryToken] 
public ActionResult EditMember(Member model)
{
Member members = new Member();
var member = DBContext.Members.Find(model.MemberID);
if (member == null)
{
return HttpNotFound();
}
if(ModelState.IsValid)
{                                
DBContext.SaveChanges();
}
return View(member);
}

最新更新