我在ASP.NET Core 1.0.0上的路由和表单有一个小问题。我有以下动作:
[Route("delete/{id:int}")]
[HttpGet]
public async Task<IActionResult> Delete(int id)
{
Post post = await _postsRepository.GetPost(id);
return View(new DeletePostViewModel
{
PostId=post.Id,
Title=post.Title
});
}
[Route("delete"),HttpPost,ValidateAntiForgeryToken]
public async Task<IActionResult> Delete([FromForm]DeletePostViewModel vm,string option)
{
if (option == "Delete")
await _postsRepository.DeletePost(vm.PostId);
return RedirectToAction("Index");
}
在我看来,我有以下几点:
<form asp-action="Delete" asp-controller="AdminPosts" asp-area="Admin" method="post" role="form">
<div class="form-group">
<input type="hidden" asp-for="PostId"/>
<label asp-for="Title"></label>
<input type="text" asp-for="Title" class="form-control" readonly="readonly"/>
</div>
<p>
<input type="submit" name="option" value="Delete" class="btn btn-danger" />
<input type="submit" name="option" value="Cancel" class="btn btn-default" />
</p>
</form>
但是它不能正确解析路由。我为表单发布的路线也有ID,因此它不能解析ID。我必须将id添加到form方法:
[Route("delete/{id:int}"),HttpPost,ValidateAntiForgeryToken]
public async Task<IActionResult> Delete(int id,[FromForm]DeletePostViewModel vm,string option)
或者我必须以taghelper形式显式删除ID:
<form asp-action="Delete" asp-controller="AdminPosts" asp-area="Admin" asp-route-id="" method="post" role="form">
我在这里可能做错了什么?为什么无法正确解析路线?
最佳答案
是的,您必须已经弄清楚了,必须显式删除id
。这是因为id
是环境值,这就是为什么在链接生成期间使用它的原因。
关于为什么发生这种情况:
一般而言(常规路由或属性路由),当要订购路由时,大多数特定的路由需要先于较少特定的路由出现,并且分段数较大的路由也要先于分段数较少的路由出现。因此,在您的情况下,路由delete/{id:int}
将自动排序为在delete
之前。现在,由于id
的值是环境值,因此满足了第一条路线的条件,因此您看到的是以这种方式生成的链接,因此要对其进行修复,需要清除它。
关于c# - 路由中带有ID的ASP.NET Core表单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38404619/