2

私はMVCルーティングを学んでいます。私の質問がばかげていないように見えることを願っています、そして助けてください:)

public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

Msdnリファレンスには、文字列、文字列、オブジェクトが必要であると書かれているので、小さな変更を加えようとします(名前を変更して機能するかどうかを確認するために、すべての前に「my」を追加します)。

    public static void RegisterRoutes(RouteCollection routes) {
        routes.IgnoreRoute("{myresource}.axd/{*mypathInfo}");

        routes.MapRoute(
            "myDefault", // Route name
            "{mycontroller}/{myaction}/{myid}", // URL with parameters
            new { mycontroller = "Home", myaction = "Index", myid = UrlParameter.Optional } // Parameter defaults
        );

もう動作しません。「{}」中括弧内のこれらの文字列の形式、および匿名オブジェクトの値の形式は何ですか。

{コントローラー}/{アクション}/{id}/製品/ショー/飲料

{テーブル}/Details.aspx/Products/Details.aspx

blog / {action} / {entry} / blog / show / 123

{reporttype} / {year} / {month} / {day} / sales / 2008/1/5

{ロケール}/{アクション}/US / show

{言語}-{国}/{アクション}/en-US / show

{コントローラー}/{アクション}/{id} http:// server / application / Products / show / beverages

{resource} .axd / {* pathInfo} http://server/application/WebResource.axd?d= ..。

グーグルで検索しましたが、すべての投稿は私がフォーマットを知っていると想定しているようで、詳細な説明が見つかりませんでした。{controller} {action} {id}などの固定名にする必要がありますか?動作しますか?デフォルトの匿名オブジェクト値の名前もそれらと一致する必要がありますか?さらに、{* pathInfo}の「*」はどういう意味ですか?その説明が見つかりませんでした。ありがとうございました。

4

1 に答える 1

7

まず、ここでいくつかの定義が必要です。

デフォルトルートを分解してみましょう。

routes.MapRoute( 
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

この場合、2行目のDefaultは、ルートを識別するために使用される単なるテキスト名です。

3行目はURLパターンです。これは、ルートがどのように一致するかを定義します。中括弧内のものはプレースホルダーです。それらはパラメーター名にマップされます。したがって、{controller}はコントローラー名にマップされます。{action}はアクション名にマップされ、{id}はidと呼ばれるパラメーターにマップされます。

4行目はデフォルトのオブジェクトです。このオブジェクトは、URLから推測できない場合に、デフォルト値を提供します。

したがって、これらすべてをまとめると、次のような結論を導き出すことができます。

デフォルトのオブジェクトは、URL文字列から推測できない場合にのみ値を提供します。したがって、着信要求がちょうどの/場合、4行目のdfault値がコントローラーとアクションに使用されます。着信要求が/Blahである場合、4行目で提供されているデフォルトのコントローラーは無視され、代わりにMVCはを検索しBlahControllerます。ただし、アクションが指定されていないため、4行目のデフォルトのアクションが使用されIndexます。

ここで覚えておくべき重要なことは、4行目の値は、3行目のURLに一致するものがない場合にのみ使用されるということです。

したがって、すべてを変更すると、すべてがループになります。使用するコントローラーまたはアクションを定義するものはなく、ルートを完了するにはこれら2つの値が必要であるため、これは無意味なルートです。そのため、MVCは必要なコントローラーを特定できません。またはそのことについての行動方法。

もう一つの例:

routes.MapRoute(
    "Example",
    "Home/{action}/{myid}",
    new { controller = "NotHome", action = "Index", myid = UrlParameter.Optional }
);

URLにプレースホルダーがないため{controller}、デフォルトの「NotHome」が使用され、MVCがを検索しNotHomeControllerます。したがって、のURLは/Home/About/3、controller = "NotHome"、action = "About"、およびmyid=3を意味します。

全体として、着信ルートでは、少なくともコントローラーとアクションの値を何かで入力する必要があります。idはオプションであり、好きな名前に変更できます。しかし、何かがコントローラーとアクションのパラメーターを設定する必要があります。そうしないと、MVCは物事をルーティングする方法を知りません。

また、デフォルトルート(または有効なデフォルトルート)がリストの最後に来る必要があることを忘れないでください。そうでない場合、他のルートは一致しません。

この{*pathInfo}ビットはスラッグと呼ばれます。これは基本的に、「この時点以降のすべてがpathInfoと呼ばれるパラメーターに詰め込まれている」というワイルドカードです。したがって、次"{resource}.axd/{*pathInfo}"のようなURLがある場合http://blah/foo.axd/foo/bar/baz/bing、2つのパラメータが作成されます。1つはを含むと呼ばれる、もう1つはをresource含むと呼ばれるパラメータです。foopathInfofoo/bar/baz/bing

于 2012-04-27T05:26:39.273 に答える