3

次の順序でルーティング ルールがあります。

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 ステートメントは、「Featured」の「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");
    }
4

1 に答える 1

2

カテゴリに必要なルートは 1 つだけです。

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
}

そして、私が示したようにリンクを構築することの利点は、ルートを変更することを決定した場合...何も壊れないことです. 最終的に URL の見た目が気に入らなく/Shop/Featured/なり、単に にしたい/Featured/ので、ルートを変更するとします。

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

上記の例では、 とのリンクid="A2"は引き続き機能しますが、id="A3"は壊れています。

于 2013-09-28T20:57:26.097 に答える