繁体   English   中英

ASP.NET Web窗体路由歧义

[英]ASP.NET Web Forms Routing Ambiguity

我按以下顺序拥有路由规则:

routes.MapPageRoute("Corporate", "Shop/{Category}", "~/Shop.aspx");
routes.MapPageRoute("GiftType", "Shop/{Category}", "~/Shop.aspx");
routes.MapPageRoute("Occasion", "Shop/{Category}", "~/Shop.aspx");
routes.MapPageRoute("Discounted", "Shop/{Category}", "~/Shop.aspx");
routes.MapPageRoute("Featured", "Shop/{Featured}", "~/Shop.aspx");

我正在使用的链接:

<a href="~/Shop/Corporate" title="Corporate Gifts" runat="server">Corporate</a>
<a href="~/Shop/GiftType" title="Shop by Gift Type" runat="server">Gift Type</a>
<a href="~/Shop/Occasion" title="Shop by Occasion" runat="server">Occasion</a>
<a href="~/Shop/Discounted" title="Discounted" runat="server">Discounted</a>
<a href='<%# "~/Shop/"+Eval("Featured") %>' title='<%# Eval("ProductName") %>'
    runat="server"> 

在目标页面的代码隐藏中,以下代码有效,我不知道为什么。 switch语句是针对“精选”的案例值“True”执行的? 这就像我根据占位符不区分这些路线?

if (Page.RouteData.Values["Category"] != null)
{
    string category = Page.RouteData.Values["Category"].ToString();

    switch (category)
    {
        case ("Corporate"):
            Response.Write("Corporate");
            break;
        case ("GiftType"):
            Response.Write("GiftType");
            break;
        case ("Occasion"):
            Response.Write("Occasion");
            break;
        case ("Discounted"):
            Response.Write("Discounted");
            break;
        // Do not want the following to be picked up here for Category param
        case ("True"):
            Response.Write("Featured");
            break;           
    }
}

我想在代码方面工作的是这样的:

    if (Page.RouteData.Values["Category"] != null)
    {
        string category = Page.RouteData.Values["Category"].ToString();

        switch (category)
        {
            case ("Corporate"):
                Response.Write("Corporate");
                break;
            case ("GiftType"):
                Response.Write("GiftType");
                break;
            case ("Occasion"):
                Response.Write("Occasion");
                break;
            case ("Discounted"):
                Response.Write("Discounted");
                break;          
        }
    }
    else if (Page.RouteData.Values["Featured"].ToString() == "True")
    {
        Response.Write("Featured");
    }

您的类别只需要一条路线:

routes.MapPageRoute("shop-categories", "Shop/{Category}", "~/Shop.aspx");

然后你可以像你一样构建URL,或者像

<a id="a1" href="<%$ RouteUrl:Category=Discounted,routename=shop-categories%>" title="Discounted" runat="server">Discounted</a>

我认为你想要一个不同的路线(为了清晰起见)的特色,如

routes.MapPageRoute("featured", "Shop/Featured/{Featured}", "~/Shop.aspx");

和链接(两种方式):

<a id="A2" href="<%$ RouteUrl:Featured=False,routename=featured%>" title="Featured" runat="server">Featured False</a>
<a id="A3" href="~/Shop/Featured/True" title="Featured" runat="server">Featured True</a>

然后你的代码隐藏:

if (Page.RouteData.Values["Category"] != null)
{
    //something
}
else if (Page.RouteData.Values["Featured"] != null)
{
    //something
}

像我所展示的那样建立链接的好处是,如果你决定改变你的路线......你不会破坏任何东西。 假设你最终不喜欢网址/Shop/Featured/的外观,只是希望它/Featured/ ,所以你改变你的路线:

routes.MapPageRoute("featured", "Featured/{Featured}", "~/Shop.aspx");

现在在上面的例子中, id="A2"的链接仍然可以使用,而id="A3"现在已经被破坏了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM