Asp.net core Asp.net核心2.1路由问题

Asp.net core Asp.net核心2.1路由问题,asp.net-core,routes,.net-core,asp.net-routing,asp.net-core-2.1,Asp.net Core,Routes,.net Core,Asp.net Routing,Asp.net Core 2.1,我在asp.net core 2.1中尝试了一些路由,但遇到了路由问题 Startup.cs->配置方法 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{Controller=Demo}/{Action=Index}/{id?}"); }); DemoController.cs [Route("

我在asp.net core 2.1中尝试了一些路由,但遇到了路由问题

Startup.cs->配置方法

app.UseMvc(routes => {
            routes.MapRoute(
                name: "default", 
                template: "{Controller=Demo}/{Action=Index}/{id?}");
        });
DemoController.cs

[Route("demo")]
public class DemoController : Controller
{
    [Route("")]
    [Route("index")]
    [Route("MyDemoPage")]
    [Route("~/")]
    public IActionResult Index()
    {
        return View();
    }

    [Route("demo2/{id}")]
    [Route("cj/{id}")]
    public IActionResult Demo2(int id)
    {
        ViewBag.id = id;
        return View("Demo2");
    }

    [Route("demo3/{id1}/{id2}")]
    [Route("cc/{id1}/{id2}")]
    public IActionResult Demo3(int id1,string id2)
    {
        ViewBag.id = id1;
        ViewBag.id2 = id2;
        return View("Demo3");
    }
}
Index.cshtml页面

@*[Route("demo2/{id}")]*@
<br />
<a asp-controller="demo" asp-action="demo2" asp-route-id="123">Demo2</a>
@*Above Tag renders :> <a href="/demo/cj/123">Demo2</a>*@ Link 1
<br />
@*[Route("cj/{id}")]*@
<br />
<a asp-controller="demo" asp-action="cj" asp-route-id="07">Demo2 via route CJ</a>
@*Above Tag renders :> <a href="/demo/cj/07">Demo2 via route CJ</a>*@ Link 2

<br />
@*[Route("demo3/{id1}/{id2}")]*@
<br />
<a asp-controller="demo" asp-action="demo3" asp-route-id1="123" asp-route-id2="P001">Demo3</a>
@*Above Tag renders :> <a href="/demo/cc/123/P001">Demo3</a>*@ Link 3
<br />
@*[Route("cc/{id1}/{id2}")]*@
<br />
<a asp-controller="demo" asp-action="cc" asp-route-id1="123" asp-route-id2="abc">Demo via CC</a>
@*Above Tag renders :> <a href="/demo/cc?id1=123&id2=abc">Demo via CC</a>*@ Link 4
@*[路由(“demo2/{id}”)]*@

*@链接1
@*[路由(“cj/{id}”)]*@
*@链接2
@*[路由(“demo3/{id1}/{id2}”)]*@
*@链接3
@*[路由(“cc/{id1}/{id2}”)]*@
*@链接4
Demo2.cshtml

 @*[Route("index")]*@
    <br />
    <a asp-controller="demo" asp-action="index">Index Page</a>
    @*Above Tag renders :> <a href="/demo/MyDemoPage">Index Page</a>*@ Link 5
    <br />
    @*[Route("MyDemoPage")]*@
    <br />
    <a asp-controller="demo" asp-action="MyDemoPage">Index Page via MyDemoPage 
    Route</a>
    @*Above Tag renders :> <a href="/demo/MyDemoPage">Index Page via MyDemoPage 
    Route</a>*@ Link 6
@*[路线(“索引”)]*@

*@链接5
@*[路线(“MyDemoPage”)]*@
*@链接6

我不明白为什么链接4和链接3在index.cshtml和 链接5和链接6呈现相同的href
请帮助…

因为链接5和链接6的不同结果是由不同的规则生成的

对于URL生成,
RouteCollection
调用以使用
IRouter
生成URL。有两个默认irouter,
Microsoft.AspNetCore.Mvc.Internal.AttributeRoute
Microsoft.AspNetCore.Mvc.Internal.mvcroutHandler

对于
asp action=“index”
,它由
AttributeRoute
处理,并将
MyDemoPage
排序在
index
之前。您可以通过检查来检查比较逻辑。如果将
[Route(“MyDemoPage”)]
更改为
[Route(“MyDemoPage”)]
,它将生成/demo/index

对于
asp action=“MyDemoPage”
GetMatches
IList
返回零计数。然后,它转到
MvcRouteHandler
,并调用
RouteBase
。将生成/demo/MyDemoPage

GetMatches
的不同结果由控制器操作中是否存在
asp操作的值来控制。对于您的场景,
Index
是存在的,但是
MyDemoPage
不是,没有相应的
MyDemoPage
方法

更新

再次,关键的不同结果是由
操作
在控制器方法中是真实存在的。

对于
asp action=“cc”
,在
DemoController
中没有
cc
操作,它与
控制器MVC活页夹一起,格式为
/demo/cc?id1=123&id2=abc


对于
asp action=“demo3”
,有一个名为
demo3
的操作,它由
Router Attribute Binder
生成,并将依次生成
\u template=“demo/cc/{id1}/{id2}”
\u template=“demo/demo3/{id1}/{id2}”。对于订单,它将返回
/demo/cc/123/P001

,因为链接5和链接6的不同结果是由不同的规则生成的

对于URL生成,
RouteCollection
调用以使用
IRouter
生成URL。有两个默认irouter,
Microsoft.AspNetCore.Mvc.Internal.AttributeRoute
Microsoft.AspNetCore.Mvc.Internal.mvcroutHandler

对于
asp action=“index”
,它由
AttributeRoute
处理,并将
MyDemoPage
排序在
index
之前。您可以通过检查来检查比较逻辑。如果将
[Route(“MyDemoPage”)]
更改为
[Route(“MyDemoPage”)]
,它将生成/demo/index

对于
asp action=“MyDemoPage”
GetMatches
IList
返回零计数。然后,它转到
MvcRouteHandler
,并调用
RouteBase
。将生成/demo/MyDemoPage

GetMatches
的不同结果由控制器操作中是否存在
asp操作的值来控制。对于您的场景,
Index
是存在的,但是
MyDemoPage
不是,没有相应的
MyDemoPage
方法

更新

再次,关键的不同结果是由
操作
在控制器方法中是真实存在的。

对于
asp action=“cc”
,在
DemoController
中没有
cc
操作,它与
控制器MVC活页夹一起,格式为
/demo/cc?id1=123&id2=abc


对于
asp action=“demo3”
,有一个名为
demo3
的操作,它由
Router Attribute Binder
生成,并将依次生成
\u template=“demo/cc/{id1}/{id2}”
\u template=“demo/demo3/{id1}/{id2}”。对于订单,它将返回
/demo/cc/123/P001

#陶卓-感谢您的时间。对于链接5和链接6,它们都使用相同的属性asp-route-id1和asp-route-id2,只有操作值不同,即“cc”和“demo3”,但其中一个是使用旧式查询字符串创建链接,即cc?id1=123和id2=abc,另一个是创建cc/123/P001#Tao Zhuo-有什么不同#Tao Zhuo-感谢时间。对于链接5和链接6,它们都使用相同的属性asp-route-id1和asp-route-id2,只有操作值不同,即“cc”和“demo3”,但其中一个是使用旧式查询字符串创建链接,即cc?id1=123&id2=abc,另一个是创建cc/123/P001#Tao Zhuo-有什么不同