0

私の MVC ソリューションには、さまざまな領域があります。エリアの登録の 1 つであるクラスが下に表示されます。

 public class CommercialAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Commercial";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {

            context.MapRoute(
                "Commercial_default",
                "Commercial/{controller}/{action}/{id}",
                new {  action = "Index", id = UrlParameter.Optional }
            );
        }
    }

これに基づいて、URL hxxp://localhost:63363/Commercial/VesselManagementは、VesselManagement コントローラの Index アクション メソッドを呼び出す必要があります。時々、予想どおりに呼び出しました。しかし、今はアクション メソッドを実行しません。

しかし、URL をhxxp://localhost:63363/Commercial/VesselManagement/index/abcと入力すると、Action メソッド Index が呼び出され、パラメーター abs が渡されます。

このアクション メソッドだけでなく、アプリケーション全体のすべてのアクション メソッドに対して、このパターンで URL を呼び出す必要があります。何が問題になる可能性がありますか。助けてくれてありがとう。

注: httpの代わりにhxxpを使用しました


Global.asx

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
            //Configure FV to use StructureMap
            var factory = new StructureMapValidatorFactory();

            //Tell MVC to use FV for validation
            ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(factory));
            DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
        }
    }

VesselManagement Index() アクション

public ActionResult Index()
        {

            InitialData();
            return View();
        }

注:今、index がパラメーターを取らないことに気付きましたが、それがルーティングに影響することはわかっています。

4

1 に答える 1

0

この問題は、私の同僚の 1 人がエリアを作成した際の間違いによるものであり、エリア登録のために彼がルーティング ルールを誤って言及したことが原因でした。

 public class SharedAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Shared";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Shared_default",
                "{controller}/{action}/{id}", //<---- This made the issue with routing

                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }

間違いを見つけた方法は、以下の手順を説明するのに役立ちます。

まず、Route Debuggerをインストールしました

次に、エラーを処理するために Global.asx に Application_Error を書き込みました。これが書かれていない場合、Route Debugger はルーティングを見つけることができません。

protected void Application_Error(object sender, EventArgs e)
        {
            Exception exception = Server.GetLastError();
            // Log the exception.

            //ILogger logger = Container.Resolve<ILogger>();
           // logger.Error(exception);

            Response.Clear();

            HttpException httpException = exception as HttpException;

            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Error");

            if (httpException == null)
            {
                routeData.Values.Add("action", "Index");
            }
            else //It's an Http Exception, Let's handle it.
            {
                switch (httpException.GetHttpCode())
                {
                    case 404:
                        // Page not found.
                        routeData.Values.Add("action", "HttpError404");
                        break;
                    case 500:
                        // Server error.
                        routeData.Values.Add("action", "HttpError500");
                        break;

                    // Here you can handle Views to other error codes.
                    // I choose a General error template  
                    default:
                        routeData.Values.Add("action", "General");
                        break;
                }
            }

            // Pass exception details to the target error View.
            routeData.Values.Add("error", exception);

            // Clear the error on server.
            Server.ClearError();

            // Avoid IIS7 getting in the middle
            Response.TrySkipIisCustomErrors = true;

            // Call target Controller and pass the routeData.
            //IController errorController = new ErrorController();
            //errorController.Execute(new RequestContext(
            //     new HttpContextWrapper(Context), routeData));
        }

次に、URL hxxp://localhost:63363/Commercial/VesselManagement を入力すると、出力は ここに画像の説明を入力

出力ルート データとデータ トークンでは、共有エリア内の商用コントローラーと VesselManagement ACtion を見つけようとしていることを明確に示しています。

エラーの理由は、共有エリアのルーティングが正しく指定されていないためであり、前に共有を追加して修正すると解決されます。

public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Shared_default", "Shared/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); }

RouteDebugger のおかげで

注:ルーティングは上から下に機能し、一致するルートが見つかると残りは無視されます。

于 2012-12-01T04:17:55.403 に答える