我在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
即可呈现正确的网页。
答案 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=""
这种行为可能是设计的,但我认为上面的神奇路由问题必定是一个错误。