-1

これらのルーティングはglobal.asaxにあります

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}/{Name}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional },
            namespaces: new[] {"MVCTemplateProject.Controllers"}
            );
        routes.MapRoute(
            name: "Post",
            url: "{controller}/{action}/{id}/{Title}",
            defaults: new {controller = "Post", action = "Index", id = UrlParameter.Optional, Title = UrlParameter.Optional},
            namespaces: new[] {"MVCTemplateProject.Controllers"}
            );

        routes.MapRoute(
            name: "GetPostByCategoryName",
            url: "{controller}/{action}/{CategoryName}",
            defaults:
                new {controller = "Post", action = "Index", id = UrlParameter.Optional, CategoryName = UrlParameter.Optional},
            namespaces: new[] {"MVCTemplateProject.Controllers"}
            );

このhrefhttp: //mysite.com/Post/GetPostsByTagId/3/a とのリンクがあります。行をクリックして、同じアドレスの同じリンクを持つページにリダイレクトすると、リンクのアドレスは http://mysiteになります。 .com / Post / GetPostsByTagId / 3 / a / 2/asdasd エラーを発生させるこれは私のリンク構文です

   <a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name)\@category.Id\@category.Name.ToSeoUrl()">@category.Name</a>
4

1 に答える 1

0

この答えはあなたの質問に完全には答えないかもしれませんが、それはあなたを助けるはずです。

URL.Action()

最初に小さなこと。リンクしたURLはバックスラッシュを使用していますが、スラッシュを使用する必要があります。だから変更

 <a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name)\@category.Id\@category.Name.ToSeoUrl()">@category.Name</a>

 <a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name)/@category.Id/@category.Name.ToSeoUrl()">@category.Name</a>

私たちがあなたを助けるために、現在の結果が何であるかも示してください。

また、このパートでは、追加のurlパラメーターにルート値を使用して、MVCルーティングシステムがSEOに最適化されたURLのどこに何を配置するかを分類できるようにします。したがって、次のようになります。

<a href="@Url.Action(MVC.Post.ActionNames.GetPostsByCategoryId,MVC.Post.Name, new { id = category.Id, CategoryName = category.Name.ToSeoUrl() })">@category.Name</a>

MVCルーティング

あなたの質問に関する主要な部分はルーティングに関連しています。現在のルートを設定する方法は、そのルートのすべてのパラメーターがオプションであるため、最初のルートがすべてをキャッチすることです。

を使用するUrl.Action()場合、またはリクエストがルートと照合される場合、最初に一致する可能性が使用されます。可能な限り最適なものを見つけようとはしません。

つまり、最も具体的なルートを一番上に配置する必要があるという考えです。それらが一致する場合は使用され、一致しない場合は、MVCが自動的に挿入するような、通常はキャッチオールルートになるまで継続されます。

2番目と3番目のルートには、引き続きパラメーターがオプションです。これらのルートでは、パラメータを必須にする必要があるということではありませんか?

2番目のパラメーターは4つのパラメーターを持っているのに対し、他のパラメーターは3つあるため、3番目のパラメーターよりも少し具体的に見えます。最初のものは、キャッチオールルートとして意図されているようです。

そして最後の部分として、デフォルト値を指定した場合でも、それを他のものに置き換えることができます。したがって、それを、だけに一致させたい場合は、ではなく、PostControllerに配置する必要があります。urldefaults

これにより、次の変更されたルーティングルールが発生します。

routes.MapRoute(
    name: "Post",
    url: "Post/Index/{id}/{Title}",
    defaults: new { controller = "Post", action = "Index" },
    namespaces: new[] {"MVCTemplateProject.Controllers"}
);

routes.MapRoute(
    name: "GetPostByCategoryName",
    url: "Post/GetPostByCategoryName/{CategoryName}",
    defaults: new { controller = "Post", action = "GetPostByCategoryName" },
    namespaces: new[] {"MVCTemplateProject.Controllers"}
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}/{Name}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional },
    namespaces: new[] {"MVCTemplateProject.Controllers"}
);

ご覧のとおり、urlsはに修正されてPostControllerいますが、ルートはコントローラーとアクションが何であるかを魔法のように認識していないため、でそれらを指定する必要がありますdefaults

結論

MVCルーティングシステムをもう少し理解してみてください。この説明は、途中で少し役立つはずです。または、すでに問題を解決するのに役立つ場合もあります。

何が必要かは(これがそうである場合)完全には明確ではありません。あなたがあなたの質問を詳しく説明するならば、私は私の答えを詳しく説明するかもしれません。

于 2013-01-09T13:20:20.220 に答える