2012-01-12 12 views
28

वहाँ नियंत्रक और कार्रवाई का नाम से Uris के निर्माण के लिए जानकारी का एक बहुत कुछ है, लेकिन कैसे मैं इस दूसरी तरह के आसपास कर सकते हैं?मैं रेफरर उरी से नियंत्रक और कार्य नाम कैसे प्राप्त करूं?

असल में, सब मैं प्राप्त करने के लिए कोशिश कर रहा हूँ चर्चा करते हुए पृष्ठ (यानी Request.UrlReferrer) से नियंत्रक और कार्रवाई का नाम पाने के लिए है। क्या इसे हासिल करने का कोई आसान तरीका है?

var controller = RouteData.Values["controller"].ToString(); 
var action = RouteData.Values["action"].ToString(); 
+1

http://stackoverflow.com/questions/7087663/getting-the-names-of-previous-action-and-controller-in-mvc- नियंत्रक – Maheep

उत्तर

45

मुझे लगता है कि इस चाल करना चाहिए:

// 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"]; 

मेरे दृश्य स्टूडियो वर्तमान में बंद है तो मैं यह परीक्षण नहीं कर सकता है, लेकिन यह अपेक्षा के अनुरूप काम करना चाहिए।

+2

आप इस कोड को थोड़ा संपादित करना चाहते हैं। यदि आपके रेफरर में कोई क्वेरीस्ट्रिंग नहीं है, तो आप fullUrl.Substring (0, -1) को कॉल करने का प्रयास कर लेंगे। – rossisdead

+1

@rossisdead। किया हुआ। पारितोषिक के लिए धन्यवाद। – gdoron

+0

मेरे लिए मुझे 'pathData.Values' से वर्णन करने के तरीके में क्षेत्र का नाम नहीं मिल सका, इसके बजाय मैंने' pathData.DataTokens ["क्षेत्र"] 'का उपयोग किया। – Leigh

3

RouteData वस्तु इस जानकारी का उपयोग कर सकते हैं। तुम क्या हमेशा सकता नियंत्रकों और कार्रवाई तरीकों लपेट इतना है कि वे एक लगातार डेटा स्टोर में रिकॉर्ड किए जाते हैं, और फिर जब आप पिछले नियंत्रक/कार्रवाई विधि की आवश्यकता होती है, बस इसे डेटाबेस (या जो भी आप ऐसा चुनते हैं) से पुनः प्राप्त है।

+24

जो आपको वर्तमान डेटा देगा, पिछले डेटा नहीं। – gdoron

+0

http://stackoverflow.com/a/31749391/4293929 – MstfAsan

0

मैं नहीं मानता है किसी भी अंतर्निहित रास्ता पिछले नियंत्रक/कार्रवाई विधि कॉल को पुनः प्राप्त करने:

0

यह एक विधि मैं (के साथ समाप्त ")) /"), क्योंकि मैं टोकन था रेफरर से सरलीकृत यूआरएल को निकालने के लिए मेरे यूआरएल में ताकि आप आसानी से निकाल सकते हैं नियंत्रक और बना दिया है इस से कार्रवाई:

private static string GetURLSimplified(string url) 
    { 
     string separator = "))/"; 
     string callerURL = ""; 

     if (url.Length > 3) 
     { 
      int index = url.IndexOf(separator); 
      callerURL = url.Substring(index + separator.Length); 
     } 
     return callerURL; 
    } 
0

आपको यूआरएल से एक्शनलिंक बनाने की आवश्यकता क्यों होगी? एक्शनलिंक का उद्देश्य कुछ डेटा से यूआरएल बनाने के विपरीत है। तो अपने पेज में सिर्फ कार्य करें:

var fullUrl = Request.UrlReferrer.ToString(); 
<a href="@fullUrl">Back</a> 
2

के gdoran को स्वीकार कर लिया जवाब जोड़ने के लिए, मैंने पाया है कि अगर एक कस्टम मार्ग विशेषता प्रयोग किया जाता है कार्रवाई आबादी प्राप्त करता है। मेरे लिए निम्नलिखित काम करता है:

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

@ गॉर्डन समाधान काम करता है, लेकिन आप

return RedirectToAction(actionName.ToString(), controllerName.ToString(),values); 

उपयोग करने के लिए यदि आप पिछले कार्रवाई

को
2

जाना gdoron के जवाब पर विस्तार करने के लिए, Uri चाहते जरूरत कक्षा में स्ट्रिंग पार्सिंग किए बिना यूआरएल के बाएं और दाएं हिस्सों को हथियाने के तरीके हैं:

url = Request.UrlReferrer.GetLeftPart(UriPartial.Path); 
querystring = Request.UrlReferrer.Query.Length > 0 ? uri.Query.Substring(1) : string.Empty; 

// 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"]; 
+1

'querystring = request.UrlReferre.GetComponents (UriComponents.Query, UriFormat.UriEscaped) का उपयोग करें;' इसके बजाय क्वेरीस्ट्रिंग के लिए। –

0

मुझे पता है कि यह पोस्ट पुराना है लेकिन मैंने सोचा कि यह अच्छा था।

आप कैसे अपने मार्ग की स्थापना की है पर एक विचार है, तो आप कर सकता है:

Dim reffererPaths As String() = Request.UrlReferrer.Segments 

मैं इसे इस्तेमाल किया निर्धारित करने के लिए अगर मैं एक लेआउट या नहीं फिर से लोड करने के लिए किया था:

Function YourAction() As ActionResult 
     Dim refererPaths As String() = Request.UrlReferrer.Segments 
     Dim controller As String = RouteData.Values("controller").ToString() 

     If refererPaths(2).Replace("/", "") <> controller Then 
      Return View("YourAction", "SpecificLayout") 
     End If 

     Return View() 
    End Function 

के लिए मैं, रेफररपैथ (2) हमेशा मेरे नियंत्रक होने जा रहा था। अगर कोई कार्रवाई नियंत्रक के बाद निर्दिष्ट था, मैं सिर्फ खंड से "/" हटा दिया और फिर मैं वर्तमान नियंत्रक में रेफ़रलकर्ता नियंत्रक की तुलना करें।

0

यहाँ प्रतिक्रिया वस्तुओं बनाने के बिना यह करने के लिए एक हल्के तरीका है।

var values = RouteDataContext.RouteValuesFromUri(Request.UrlReferrer); 

var controllerName = values["controller"]; 
var actionName = values["action"]; 

इस कस्टम का उपयोग करता है HttpContextBase वर्ग

public class RouteDataContext : HttpContextBase { 
    public override HttpRequestBase Request { get; } 

    private RouteDataContext(Uri uri) { 
     var url = uri.GetLeftPart(UriPartial.Path); 
     var qs = uri.GetComponents(UriComponents.Query,UriFormat.UriEscaped); 

     Request = new HttpRequestWrapper(new HttpRequest(null,url,qs)); 
    } 

    public static RouteValueDictionary RouteValuesFromUri(Uri uri) { 
     return RouteTable.Routes.GetRouteData(new RouteDataContext(uri)).Values; 
    } 
} 
संबंधित मुद्दे