3

「HomeController」というコントローラーを含む領域(「User」と呼ばれる)を含む単純なMVC4Webサイトがあります。

このコントローラーには、インデックスと詳細の2つのアクションメソッドがあります。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Details(int id)
    {
        return View();
    }
}

「UserAreaRegistration.cs」クラスは次のとおりです。

public class UserAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "User";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "User_default",
            "User/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "MvcApplication1.Areas.User.Controllers" }
        );

        context.MapRoute(
            "User_default_no_contoller",
            "User/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "MvcApplication1.Areas.User.Controllers" }
        );
    }
}

「HomeController」と呼ばれる領域にないコントローラーもあります。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

RouteConfig.cs(非エリアルートの場合)は次のとおりです。

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

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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

どちらからでも「ホームページ」にアクセスできます

  • /
  • /家
  • /ホーム/インデックス

「ユーザー」エリアの「インデックス」アクションにアクセスすることもできます

  • /ユーザー

ができないことは、「詳細」と呼ばれるエリアのコントローラーで他の方法に到達する方法を見つけることです。

  • / User / Details / 5は機能せず、404を返します

また、Indexメソッドに明示的にアクセスしようとしても、正しくルーティングされないことに気付きました。

  • / User / Indexは機能せず、404を返します

私は何が間違っているのですか?

エリア内の「デフォルト」コントローラーであるコントローラーの「インデックス」以外のアクションメソッドに到達することは可能ですか?

4

3 に答える 3

4

最初のルートにはデフォルトが多すぎるため、すべてを飲み込んでしまいます。

  • URIはUser_default/User/Details/5ルートと一致します(コントローラー:「詳細」およびアクション:「5」)。
  • URI/User/Indexも最初のルートと一致します(コントローラー:「インデックス」およびデフォルトのアクション:「インデックス」)

ルートにアプローチする方法は

  • 最も選択的なルートを最初に置く
  • 必要な最小のデフォルト値のみを設定します
  • ルート制約を使用して、MVCルーターがパラメーターを誤って一致させようとしないようにします(つまり、intパラメーターを対象としたルート値に数値制約を与えます)
  • 最も一般的なルート(つまり、User_default)を最後に配置します(これ以上特定のルートと一致しなかったURIのキャッチオールとして)

このようにエリアルートを設定してみます。

context.MapRoute(
        "User_default_no_contoller",
        "User/{action}/{id}",
        defaults: new { controller = "Home", id = UrlParameter.Optional },
        constraints: new { id = @"\d+" },
        namespaces: new[] { "MvcApplication1.Areas.User.Controllers" }
    );

context.MapRoute(
        "User_default",
        "User/{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "MvcApplication1.Areas.User.Controllers" }
    );
于 2012-09-27T03:50:28.993 に答える
2

この「マルチデフォルト」の問題を克服するためのもう1つの提案は、名前空間を使用して分離することです。

あなたの例では、私の提案は、名前空間「Areas.User」にクラスUserAreaRegistrationを含めることです。その後、名前空間「Areas.User.Controllers」のユーザーエリアにHomeControllerを配置する必要があります。

それは私のために働き、コードをきれいに保ちます。

ピーター

于 2013-12-01T20:58:10.277 に答える
0

答えdbasemanをありがとう。それは私が自分のルーティングの問題を調べるのに役立ちました。同じ問題が発生したかどうかはわかりませんが、そのように見えます。

        routes.MapRoute("Tag", "Tag/{tag}", new { controller = "Blog", action = "Tag" });
        routes.MapRoute("Category", "Category/{category}", new { controller = "Blog", action = "Category" });
        routes.MapRoute("Post", "Archive/{year}/{month}/{day}/{title}", new {controller = "Blog", action = "Post"});
        routes.MapRoute("Action", "{action}", new { controller = "Blog", action = "Posts" });

「アクション」パラメータが他のルートより上にある最後のルートがある場合、「アクション」より下のルートはキャッチされませんでした。これをRouteConfigの一番下に移動すると、その上のすべてのものを正常にヒットできるようになりました。

于 2013-01-31T10:42:40.027 に答える