为什么ASP.NET Core忽略了asp-action helper标签?

时间:2017-11-29 18:41:03

标签: asp.net-mvc razor asp.net-core asp.net-core-2.0

我在Core 2.0 MVC应用中遇到了意外行为。看看这个:

我有一个控制器" ProfileController.cs"用简单的方法:

public async Task<IActionResult> Index()
{
    return View();
}

public async Task<IActionResult> Edit()
{
    return View();
}

我在Profile / Index.cshtml中获得了以下标记:

<a asp-controller="Profile" asp-action="Edit">Edit Profile</a>

我在Startup.cs中使用以下路由映射:

routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");

但这是我看到的疯狂行为:

锚标记始终生成并生成 profile/index! 无论如何。完全忽略asp-action="Edit"并导致&#34; index&#34;甚至&#34; index / 2&#34;如果网址上有其他参数。

为什么?

我知道我的路由工作正常,因为只需输入/profile/profile/index/profile/edit即可呈现正确的网页。

1 个答案:

答案 0 :(得分:0)

好的,这是半个答案。我解决了这个问题,但Razor引擎应用什么魔法的问题仍然是一个谜。

我忽略了在上面提到的同一个ProfileController中应用于POST方法的错误路由:

<div class="box">
  <div class="box1">
    <div class="smalltitle2">Mother of Three Buys Tuna Steak at Phish Concert. Leaves, "Feeling Funny."</div>   
  </div>
</div>

请注意应用于名为&#34;编辑&#34;的方法的&#34; / Index&#34; 操作(糟糕!)

删除/修复该路线修复了主要问题:

[HttpPost]
[Route("[controller]/Index")]
public async Task<IActionResult> Edit([FromForm]User m)
{
    // do stuff
    return View();
}

但它仍然提出了一个问题:为什么Razor引擎通过(显然,神奇地)嗅探周围并查看与所请求的操作无关的POST路线来应用错误的东西? (请记住,在URL中键入[HttpPost] [Route("[controller]/Edit")] public async Task<IActionResult> Edit([FromForm]User m) { // do stuff return View(); } 工作正常,尽管我犯了错误,但路由仍在为GET工作。)

此外,它没有解决当前网址的参数应用于路径的问题......

如果我在/profile/edit,则呈现的操作将正确为/profile/index。但如果我在/profile/index,那么渲染的操作将会错误为/profile/Index/2。我不希望id被包含在动作中。要解决此问题,我必须按如下方式添加 /profile/Index/2

asp-route-id=""

这种行为可能是设计的,但我认为上面的神奇路由问题必定是一个错误。