How do I get the Controller and Action names from the Referrer Uri?

前端 未结 9 921
清歌不尽
清歌不尽 2020-12-01 14:06

There\'s a lot of information for building Uris from Controller and Action names, but how can I do this the other way around?

Basically, all I\'m trying to achieve i

相关标签:
9条回答
  • 2020-12-01 14:44

    I think this should do the trick:

    // Split the url to url + query string
    var fullUrl = Request.UrlReferrer.ToString();
    var questionMarkIndex = fullUrl.IndexOf('?');
    string queryString = null;
    string url = fullUrl;
    if (questionMarkIndex != -1) // There is a QueryString
    {    
        url = fullUrl.Substring(0, questionMarkIndex); 
        queryString = fullUrl.Substring(questionMarkIndex + 1);
    }   
    
    // Arranges
    var request = new HttpRequest(null, url, queryString);
    var response = new HttpResponse(new StringWriter());
    var httpContext = new HttpContext(request, response)
    
    var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
    
    // Extract the data    
    var values = routeData.Values;
    var controllerName = values["controller"];
    var actionName = values["action"];
    var areaName = values["area"];
    

    My Visual Studio is currently down so I could not test it, but it should work as expected.

    0 讨论(0)
  • 2020-12-01 14:44

    To add to gdoran's accepted answer, I found that the action doesn't get populated if a custom route attribute is used. The following works for me:

    public static void SetUpReferrerRouteVariables(HttpRequestBase httpRequestBase, ref string previousAreaName, ref string previousControllerName, ref string previousActionName)
    {
        // No referrer found, perhaps page accessed directly, just return.
        if (httpRequestBase.UrlReferrer == null) return;
    
        // Split the url to url + QueryString.
        var fullUrl = httpRequestBase.UrlReferrer.ToString();
        var questionMarkIndex = fullUrl.IndexOf('?');
        string queryString = null;
        var url = fullUrl;
        if (questionMarkIndex != -1) // There is a QueryString
        {
            url = fullUrl.Substring(0, questionMarkIndex);
            queryString = fullUrl.Substring(questionMarkIndex + 1);
        }
    
        // Arrange.
        var request = new HttpRequest(null, url, queryString);
        var response = new HttpResponse(new StringWriter());
        var httpContext = new HttpContext(request, response);
    
        var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
        if (routeData == null) throw new AuthenticationRedirectToReferrerDataNotFoundException();
    
        // Extract the data.
        var previousValues = routeData.Values;
        previousAreaName = previousValues["area"] == null ? string.Empty : previousValues["area"].ToString();
        previousControllerName = previousValues["controller"] == null ? string.Empty : previousValues["controller"].ToString();
        previousActionName = previousValues["action"] == null ? string.Empty : previousValues["action"].ToString();
        if (previousActionName != string.Empty) return;
        var routeDataAsListFromMsDirectRouteMatches = (List<RouteData>)previousValues["MS_DirectRouteMatches"];
        var routeValueDictionaryFromMsDirectRouteMatches = routeDataAsListFromMsDirectRouteMatches.FirstOrDefault();
        if (routeValueDictionaryFromMsDirectRouteMatches == null) return;
        previousActionName = routeValueDictionaryFromMsDirectRouteMatches.Values["action"].ToString();
        if (previousActionName == "") previousActionName = "Index";
    }
    
    0 讨论(0)
  • 2020-12-01 14:45

    Why would you need to construct ActionLink from a url ? The purpose of ActionLink is just the opposite to make a url from some data. So in your page just do:

    var fullUrl = Request.UrlReferrer.ToString();
    <a href="@fullUrl">Back</a>
    
    0 讨论(0)
提交回复
热议问题