我在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/

10-17 00:28