【问题标题】:Routing Issue with my asp.net MVC 4 application我的 asp.net MVC 4 应用程序的路由问题
【发布时间】:2016-07-12 09:06:56
【问题描述】:

由于这个问题,我最近几天很忙。我正在尝试将路线数据传递给视图作为导航问题。但是 routeInfo 不包含路由信息。即 routeInfo.RouteData.Values.Count = 0。我有另一个应用程序具有相同的代码,它工作正常。

我不确定我在这里缺少什么。

任何帮助将不胜感激!

    public ActionResult Index(int type)
    {
        UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
        string url = u.Action("Action", "Controller", new { type = type }, Request.Url.Scheme);
        Uri uri = new Uri(url);
        RouteInfo routeInfo = new RouteInfo(uri, HttpContext.Request.ApplicationPath);
        Session["_ReturnURL"] = routeInfo.RouteData.Values;
        ViewBag.ReturnURL = Helpers.GetSessionKey("_ReturnURL");

        return View();
    }


    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.RouteExistingFiles = true;
        routes.IgnoreRoute("elmah.axd");
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Controller",
            url: "Controller/{type}/{action}/{id}",
            defaults: new { controller = "Controller", action = "Action", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "CBlah", action = "ABlah", id = UrlParameter.Optional, returnUrl = "~/Blah2/Blah2" }
        );

    }


public class RouteInfo
{
    public RouteData RouteData { get; private set; }

    public RouteInfo(RouteData data)
    {
        RouteData = data;
    }

    public RouteInfo(Uri uri, string applicationPath)
    {
        RouteData = RouteTable.Routes.GetRouteData(new InternalHttpContext(uri, applicationPath));
    }

    private class InternalHttpContext : HttpContextBase
    {
        private readonly HttpRequestBase _request;

        public InternalHttpContext(Uri uri, string applicationPath)
        {
            _request = new InternalRequestContext(uri, applicationPath);
        }

        public override HttpRequestBase Request { get { return _request; } }
    }

    private class InternalRequestContext : HttpRequestBase
    {
        private readonly string _appRelativePath;
        private readonly string _pathInfo;

        public InternalRequestContext(Uri uri, string applicationPath)
        {
            _pathInfo = uri.Query;

            if (String.IsNullOrEmpty(applicationPath) || !uri.AbsolutePath.StartsWith(applicationPath, StringComparison.OrdinalIgnoreCase))
                _appRelativePath = uri.AbsolutePath.Substring(applicationPath.Length);
            else
                _appRelativePath = uri.AbsolutePath;
        }

        public override string AppRelativeCurrentExecutionFilePath { get { return String.Concat("~", _appRelativePath); } }
        public override string PathInfo { get { return _pathInfo; } }
    }
}

【问题讨论】:

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


    【解决方案1】:

    Route.GetRouteData 定义

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
        RouteValueDictionary values = this._parsedRoute.Match(virtualPath, this.Defaults);
        if (values == null)
        {
            return null;
        }
        RouteData data = new RouteData(this, this.RouteHandler);
        if (!this.ProcessConstraints(httpContext, values, RouteDirection.IncomingRequest))
        {
            return null;
        }
        foreach (KeyValuePair<string, object> pair in values)
        {
            data.Values.Add(pair.Key, pair.Value);
        }
        if (this.DataTokens != null)
        {
            foreach (KeyValuePair<string, object> pair2 in this.DataTokens)
            {
                data.DataTokens[pair2.Key] = pair2.Value;
            }
        }
        return data;
    }
    

    问题出在这一行:

    string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
    

    您正在附加一个 查询字符串 作为 httpContext.Request.PathInfo 通过:

    _pathInfo = uri.Query;
    

    我知道 Route 类不考虑查询字符串,因此将其附加到路径是一个错误。还有一些信息here 支持PathInfo 总是应该返回一个空字符串的事实。

    MSDN

    对于 URL http://www.contoso.com/virdir/page.html/tail,PathInfo 值为 /tail

    因此,添加查询字符串会导致此行失败(当有查询字符串时),因为 _parsedRoute.Match 不希望有。

    RouteValueDictionary values = this._parsedRoute.Match(virtualPath, this.Defaults);
    

    我的猜测是您的一个应用程序“有效”,因为它没有通过查询字符串传递 URL,因此匹配正确。但无论如何,您应该在 InternalRequestContext 类中从 PathInfo 返回一个空字符串,以使其 100% 工作(除非您有疯狂的 URL,其中包含点,那么您可能需要做一些额外的工作)。

    【讨论】:

    • 谢谢!!所以我改变了 _pathInfo = uri.Query;到 _pathInfo = "";但它并没有解决问题。我的网址也看起来像localhost:53404/Controller/1
    • 其余代码对我有用 - 我在 RouteInfo 中获得了 4 个路由值。您的应用程序中一定有其他东西在干扰它。
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2011-11-30
    相关资源
    最近更新 更多