【问题标题】:Asp.net Core 2.1 Routing IssueAsp.net Core 2.1 路由问题
【发布时间】:2018-08-17 17:47:10
【问题描述】:

我在 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.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

Github Link

我很困惑为什么链接 4 和链接 3 在 index.cshtml 和 链接 5 和链接 6 呈现相同的 href 请帮忙...

【问题讨论】:

    标签: asp.net-core routes .net-core asp.net-routing asp.net-core-2.1


    【解决方案1】:

    由于Link 5 & Link 6的结果不同,它们是由不同的规则生成的。

    对于 URL 生成,RouteCollection 调用 GetVirtualPath 以使用 IRouter 生成 url。有两个默认的路由器,Microsoft.AspNetCore.Mvc.Internal.AttributeRouteMicrosoft.AspNetCore.Mvc.Internal.MvcRouteHandler

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

    对于asp-action="MyDemoPage"GetMatchesIList&lt;OutboundMatchResult&gt; 返回零计数。然后,它转到MvcRouteHandler,并调用RouteBase_binder.BindValues(values.AcceptedValues); 将生成 /demo/MyDemoPage

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

    更新

    再一次,关键不同的结果是由是否 action是真实存在于Controller方法中的。

    对于asp-action="cc"DemoController 中没有cc 操作,它与Controller MVC Binder 一起使用,格式为/demo/cc?id1=123&amp;id2=abc

    对于asp-action="demo3",有一个动作叫demo3,由Router Attribute Binder生成,依次生成_template = "demo/cc/{id1}/{id2}"_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
    • #陶卓-有什么不同
    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2020-04-22
    相关资源
    最近更新 更多