使用UrlParameter.Optional的MVC 4路由需要参数

时间:2012-11-30 03:50:57

标签: asp.net-mvc-4 asp.net-mvc-routing

在我的MVC解决方案中,我有不同的领域。其中一个区域的注册是下面的等级。

 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。可能是什么问题。提前谢谢大家的帮助。

注意:我使用了hxxp insted http


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;
        }
    }

船只管理指数()行动

public ActionResult Index()
        {

            InitialData();
            return View();
        }

注意:刚才我注意到索引不带任何参数,但我知道这不会影响路由。

1 个答案:

答案 0 :(得分:0)

我真的很抱歉这个问题是由于我的一位同事在创建区域时犯了错,而且他在区域注册时错误地提到了路由规则。

 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来处理错误。如果没有写入,则路由调试器将无法找到路由。

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,输出结果为 enter image description here

在输出路径数据和数据令牌中明确表示它试图在共享区域内找到商业控制器和VesselManagement ACtion。

错误的原因是错误地指定了共享区域路由,并且当通过在frount中添加Share来更正它时,它已解决。

public override void RegisterArea(AreaRegistrationContext context)     {         context.MapRoute(             “Shared_default”             “共享/ {控制器} / {行动} /(编号)”,             new {action =“Index”,id = UrlParameter.Optional}         );     }

感谢RouteDebugger

注意:路由从上到下工作,当它找到匹配的路由时,它将忽略其余路由。