ASP.NET MVC-複数のクエリ文字列パラメーターをきれいなURLにマッピングする

StackOverflow https://stackoverflow.com/questions/417000

  •  03-07-2019
  •  | 
  •  

質問

mvc ....のseoフレンドリーなURLの設計に少しこだわっています。たとえば、次のURLを見てください。 http://myapp/venues/resturants.aspx?location = central& orderBy =トップ評価

mvcアプリでは、次のようにマッピングしました。 http:// myapp / venues / list / resturants / central / top-rated
{controller} / {action} / {category} / {location} / {order}

唯一の問題は場所と順序がオプションであるということです...したがって、次のようなリクエストを送信できるはずです: http:// myapp / venues / list / resturants / top-rated 。これは、リクエストがコントローラーアクションにヒットし、ロケーションパラメーターが「最高評価」を自然に選択したときに問題になることが判明しています。

提案はありますか?明示的なクエリ文字列を使用して複数のパラメーターを処理することを検討していますが、SEOをあまり犠牲にしたくないので、これは本当に最後のオプションです。

このようなジレンマに陥ったエルはいますか?そして、どのようにそれを処理しましたか?

事前に感謝します!

役に立ちましたか?

解決

場所と順序の許容値が一意であると仮定します(つまり、入力されたときに、それらを区別することができます。 、その後、2つのパラメーターを取得して、コントローラーにあるものを計算することができます。

ルート: {controller} / {action} / {param1} / {param2}

コントローラーアクション:

public ActionResult MyAction(string param1, string param2)
{
    string location;
    string order;
    if (!ParseLocation(param1, out location))
    { ParseLocation(param2, out location); }
    // ...
}

特にエレガントではありませんが、必要なURLを使用できます。

他のヒント

プロフィールリンクをクリックして、統計、最近、応答などのURLを確認します

例:

ソートなしで、デフォルトで統計になります

オプションのパラメータはクエリパラメータにする必要があります

複数のオプションパラメータがある場合、常にこの問題が発生します。それらのいずれかまたは両方を非オプションにする(およびオプションのクエリ文字列よりもクエリ文字列の前に配置する)か、クエリ文字列パラメータ表記を使用します。

わかりました。今まで遊んでいたソリューションを投稿してください。

次の制約を使用してルートを設定しました:

        routes.MapRoute(
            "VenuesList",                                              
            "venues/list/{category}/{location}/{orderBy}",             
            new { controller = "venues", action = "list", category = "", location = "", orderBy = "" },
            new { location = "central|east|west|south", orderBy = "top-rated|price" }
        );

    routes.MapRoute(
            "VenuesListByLocation",                                              
            "venues/list/{category}/{location}",                           
            new { controller = "venues", action = "list", category = "", location = "" },
            new { location = "central|east|west|south" }
        );

        routes.MapRoute(
            "VenuesListByOrder",                                              
            "venues/list/{category}/{orderBy}",                           
            new { controller = "venues", action = "list", category = "", orderBy = "" },
            new { orderBy = "top-rated|price" }
        );

        routes.MapRoute(
            "VenuesListDefault",                                              
            "venues/list/{category}",                           
            new { controller = "venues", action = "list", category = "" }

        );

        routes.MapRoute(
            "Default",                                              
            "{controller}/{action}/{id}",                           
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        ); 

検証は、検証に失敗するとリスト内の次のルートに移動し、最終的にデフォルトに到達するというものです。

さらにテストが必要ですが、今のところうまく機能しています...

可能なクエリ文字列パラメータごとにページにプロパティを作成しませんか?

この方法で、わずか数行のコードで選択した任意の方法で処理できます...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top