1

MVC 3および4ルーティングでは、エリア名を指定せずにエリアの一部であるアクションへのパスを構成できることに気付きましたが、ビューは返されません。たとえば、次のコードを参照してください。

namespace APS.EIMS.UI.Areas.Admin
{
    public class TestController : BaseController
    {

        public ActionResult Index()
        {
            return View();
        }

        public JsonResult GetNames()
        {
            var dc = GetDataContext();
            var result = from m in dc.Db<IMS_Reject>()
                         select new { m.Id };
            return Json(result, JsonRequestBehavior.AllowGet);
        }

    }
}

// localhost / Test / Indexを試すたびに、インデックスビューは見つかりませんが、エリア内のアクションへのパスをルーティングできます(// localhost / admin / test / indexでは期待どおりに機能します)。// localhost / admin / test/getnames//localhost/ test/getnamesでも同じ結果が得られます。なぜそれがこのように機能するのですか?エリア名なしでアクションを見つけるにはどうすればよいですか?開発中のアプリケーションでこれを防ぐ必要がありますか?(アドレスが完全な場合にのみルートを意味し、それ以外の場合は404エラーを意味します)

4

1 に答える 1

2

おそらくデフォルトのようなルートがあります:

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

したがって、 // localhost / Test / IndexのようなURLはそのデフォルトルートと照合され、ご覧のとおり、コントローラーは正しく検出されますが、ビューは検出されません。デフォルトでは、コントローラーファクトリは、場所に関係なく、要求された名前でアプリケーション内のすべてのコントローラークラスを検索します。

デフォルトルートで名前空間を明示的に設定し、MVCに他の名前空間でコントローラーを検索しないように指示すると、これを防ぐことができます。

これは、名前空間を持つ文字列配列を取得するMapRouteオーバーロードを使用し、そのルートの名前空間フォールバックを明示的に無効にすることによって行われます。(名前空間フォールバックを無効にしないと、同じ名前の複数のコントローラーが見つかった場合に、それらの名前空間に優先順位を付けるだけになります)。

これは次のようになります(単一の名前空間を設定しましたが、必要な数だけ設定できます)。

Route route = routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}",
    new[] { "APS.EIMS.UI.WhateverInNoArea" }
);
route.DataTokens["UseNamespaceFallback"] = false;
于 2013-01-03T08:04:50.887 に答える