以下是Routing Configuration:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Dashboard}/{action=Index}");
routes.MapRoute(
name: "Sample",
template: "{controller=SampleApplication}/{action=ViewApplication}/{applicationID?}/{applicationVersionID?}/{view?}");
routes.MapRoute(
name: "SampleSolution",
template: "{controller=SampleApplication}/{action=ViewApplicationSolution}/{bugID?}/{view?}");
});
为了便于理解,映射将参考如下:
Route 1: http://site/Dashboard/Index
Route 2: http://site/SampleApplication/ViewApplication/1/2/ViewName
Route 3: http://site/SampleApplication/ViewApplicationSolution/1/ViewName
2个动作如下:
public IActionResult ViewApplication(int applicationID, int applicationVersionID, string view)
{
return View();
}
public IActionResult ViewApplicationSolution(int bugID, string view)
{
return View();
}
每当调用第二个动作时,参数bugID
和view
都是NULL
对于第一个动作,我得到了所有3个参数。
在路由配置中,如果我交换路由2&的位置。路线3,我在第二个动作中得到2个参数值。但是对于第一个动作,所有3个参数都是NULL
。
我错过了Routing Configuration
中的任何内容吗?
答案 0 :(得分:2)
使用当前路由定义,当请求ViewApplicationSolution/1/ViewName
时,它与Route2的定义匹配(因为我们将其他2个参数指定为可为空)。因此参数1
实际上将映射到您的操作方法的applicationID
参数(如果存在)。您可以将BugID
操作方法的ViewApplicationSolution
参数重命名为applicationID
,并查看您的参数是否有值。此外,如果从路由模式中删除?
(表示param可以为空),它也会起作用,因为您的请求将完全匹配其中一个模式,因为我们现在没有任何可选的参数。 / p>
您注册路线的顺序非常重要。因此,请确保在通用默认路由之前注册特定路由。在具有更多参数(相同类型)
的参数之前,还要注册参数较少的参数这应该适合您的要求。
app.UseMvc(routes =>
{
routes.MapRoute(name: "SampleSolution",
template: "{controller=Settings}/{action=ViewApplicationSolution}/
{bugID?}/{view?}");
routes.MapRoute(name: "Sample",
template: "{controller=Settings}/{action=ViewApplication}/{applicationID?}/
{applicationVersionID?}/{view?}");
routes.MapRoute(name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});