2016-07-15 25 views
2

我在ASP.NET Core 1.0.0上遇到了路由和表单的一个小问题。我有下列行为:在路由中带有id的ASP.NET核心表格

[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添加到形式方法:

[Route("delete/{id:int}"),HttpPost,ValidateAntiForgeryToken] 
public async Task<IActionResult> Delete(int id,[FromForm]DeletePostViewModel vm,string option) 

,或者有明确移除ID形式taghelper:

<form asp-action="Delete" asp-controller="AdminPosts" asp-area="Admin" asp-route-id="" method="post" role="form"> 

什么可能我是错在这里干什么?为什么它不能正确解析路线?

+0

我不会推荐使用HTTP GET来删除命令... –

+0

@JeremyHolovacs删除的是POST ... –

+0

嗯,看起来像。对不起,我认为这是网络api REST调用 –

回答

2

是的,你必须明确地删除id,因为你已经想清楚了。这是因为id是一个环境值,这就是为什么它在链接生成过程中被使用。

至于为什么发生这种情况
一般(常规或属性的路由),当路由进行排序,最具体的路线需要拿出更少的具体路线,并航线之前,大段过来的数在具有较少数量的段的路线之前。因此,在您的情况下,路线delete/{id:int}将被自动命令在delete之前。现在,由于id的值是环境温度,所以第一条路线的条件已满足,因此您将看到以此方式生成的链接,因此要解决该问题,您需要清除链接。