मुझे ASP.NET MVC में किसी क्रिया का पूर्ण url कैसे मिलता है?


239

मुझे ऐसा कुछ करने की आवश्यकता है:

<script type="text/javascript">
    token_url = "http://example.com/your_token_url";
</script>

मैं MVC के बीटा संस्करण का उपयोग कर रहा हूं, लेकिन मैं यह पता नहीं लगा सकता कि किसी क्रिया का पूर्ण URL कैसे प्राप्त किया जाए। मैं ऐसा कुछ करना चाहता हूं:

<%= Url.AbsoluteAction("Action","Controller")) %>

क्या इसके लिए कोई सहायक या पृष्ठ विधि है?

जवाबों:


480

अधिक जानकारी के लिए यहां क्लिक करें , लेकिन संभावित रूप से विस्तार विधियों की कोई आवश्यकता नहीं है। यह पहले से ही बेक किया हुआ है, बस बहुत सहज तरीके से नहीं।

Url.Action("Action", null, null, Request.Url.Scheme);

6
दिलचस्प है, इसलिए यदि आप प्रोटोकॉल निर्दिष्ट करते हैं, तो URL निरपेक्ष है
Casebash

24
यह उत्तर बेहतर है, इस तरह से Resharper अभी भी मान्य कर सकता है कि लड़ाई और नियंत्रक मौजूद है। मैं http के बजाय Request.Url.Scheme के उपयोग का सुझाव दूंगा, जिस तरह से http और https दोनों समर्थित हैं।
पबिर्कॉफ

2
@Pbirkoff, इस बात से सहमत हैं कि यह सबसे अच्छा उत्तर है, लेकिन आप जानना चाहते हैं कि आप ReSharper के लिए अपने स्वयं के तरीकों की व्याख्या कर सकते हैं कि पैरामीटर कार्रवाई / नियंत्रकों का प्रतिनिधित्व करते हैं। इस तरह R # अभी भी आपके द्वारा प्रदान किए गए तार को मान्य कर सकता है, क्योंकि यह इतना अच्छा करता है।
ड्रू नोक

3
एक छोटा सा सुधार को बदलने के लिए हो सकता है "http" के साथ Request.Url.Schemeयदि आप HTTPS का उपयोग उत्पन्न यूआरएल भी HTTPS का उपयोग करेगा ताकि।
एरिक शियरबॉम

1
यह भी काम करता है Html.ActionLink(किसी भी तरीके से जो प्रोटोकॉल लेता है, उदाहरण के लिए MVC 4 में अंतिम 2)
क्रिस

74

UrlHelper बढ़ाएँ

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string AbsoluteAction(this UrlHelper url, string action, string controller)
        {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;

            string absoluteAction = string.Format(
                "{0}://{1}{2}",
                requestUrl.Scheme,
                requestUrl.Authority,
                url.Action(action, controller));

            return absoluteAction;
        }
    }
}

फिर इसे इस तरह से कॉल करें

<%= Url.AbsoluteAction("Dashboard", "Account")%>

EDIT - शोधकर्ता ANNOTATIONS

स्वीकृत उत्तर पर सबसे अधिक टिप्पणी की गई है, This answer is the better one, this way Resharper can still validate that the Action and Controller exists.इसलिए यहां एक उदाहरण है कि आप समान व्यवहार कैसे प्राप्त कर सकते हैं।

using JetBrains.Annotations

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string AbsoluteAction(
            this UrlHelper url,
            [AspMvcAction]
            string action,
            [AspMvcController]
            string controller)
        {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;

            string absoluteAction = string.Format(
                "{0}://{1}{2}",
                requestUrl.Scheme,
                requestUrl.Authority,
                url.Action(action, controller));

            return absoluteAction;
        }
    }
}

सहायक जानकारी:


3
मैं इस समाधान के लिए वैकल्पिक पैरामीटर भी जोड़ूंगा। यह सभी मामलों को कवर करना चाहिए।
यूजेनियु टोरिका

बहुत अच्छा! मैंने इस कोड का उपयोग किया था, लेकिन मैंने केवल तर्क सापेक्ष बनाया ताकि कॉल करने वाले इसे उरल विधि का उपयोग करके बना सकें जो उन्हें (राउटर मान आदि) पसंद है, और आपका तरीका इसे सापेक्ष बनाने के लिए जिम्मेदार हो सकता है। तो मेरा है: AbsoluteUrl (यह UrlHelper url, string रिश्तेदारUrl)।
रोब केंट


21

एक गाइड के रूप में @Charlino के जवाब का उपयोग करते हुए, मैं इस के साथ आया था।

UrlHelper के लिए ASP.NET MVC प्रलेखन शो कि Url.Action एक पूरी तरह से योग्य यूआरएल वापस आ जाएगी, तो एक होस्ट नाम और प्रोटोकॉल में पारित कर रहे हैं। मैं होस्ट नाम और प्रोटोकॉल के लिए मजबूर करने के लिए इन सहायकों बनाया प्रदान किया जाना। कई अतिभार उरल के लिए अतिभार को प्रतिबिंबित करते हैं।

using System.Web.Routing;

namespace System.Web.Mvc {
    public static class HtmlExtensions {

        public static string AbsoluteAction(this UrlHelper url, string actionName) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, null, (RouteValueDictionary)null, 
                              requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            object routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, null, new RouteValueDictionary(routeValues), 
                              requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            RouteValueDictionary routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, null, routeValues, requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, (RouteValueDictionary)null, 
                              requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName, 
                                            object routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, 
                              new RouteValueDictionary(routeValues), requestUrl.Scheme, 
                              null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName, 
                                            RouteValueDictionary routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, routeValues, requestUrl.Scheme, 
                              null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName, object routeValues, 
                                            string protocol) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, 
                              new RouteValueDictionary(routeValues), protocol, null);
        }

    }
}

4
कोड के लिए Thx, ने मुझे बहुत मदद की, लेकिन इस समाधान के साथ एक मुद्दा है जो आमतौर पर विकास के दौरान आता है। यदि साइट को एक विशिष्ट पोर्ट पर होस्ट किया गया है, तो पोर्ट जानकारी requestUrl में शामिल है। स्थानीयता , जैसे स्थानीयता: 4423 । किसी कारण से एक्शन विधि पोर्ट को फिर से जोड़ देती है। तो या तो यह एक्शन मेथड के अंदर एक बग है या आप पोर्ट को यहां सप्लाई करने वाले नहीं हैं। लेकिन अनुरोध पर उपलब्ध गुणों में से कौन सा सही है (DnsSafeHost या होस्ट)? अच्छी तरह से समाधान बल्कि सरल है: बस आपूर्ति शून्य है और सही तरीके से एक्शन विधि भर जाएगी।
ntziolis

मैंने @ ntziolis के सुझाव को शामिल करने का उत्तर अपडेट कर दिया है।
एंड्रयू अरनॉट

3

मुझे यकीन नहीं है कि अगर ऐसा करने का कोई तरीका है, लेकिन आप अपनी खुद की HtmlHelper विधि को रोल कर सकते हैं।

निम्नलिखित जैसा कुछ

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string AbsoluteAction(this HtmlHelper html, string actionUrl)
        {
            Uri requestUrl = html.ViewContext.HttpContext.Request.Url;

            string absoluteAction = string.Format("{0}://{1}{2}",
                                                  requestUrl.Scheme,
                                                  requestUrl.Authority,
                                                  actionUrl);

            return absoluteAction;
        }
    }
}

फिर इसे इस तरह से कॉल करें

<%= Html.AbsoluteAction(Url.Action("Dashboard", "Account"))%> »

HTH, चार्ल्स


2

तर्कों के साथ पूर्ण उत्तर होगा:

var url = Url.Action("ActionName", "ControllerName", new { id = "arg_value" }, Request.Url.Scheme);

और जो एक पूर्ण url का उत्पादन करेगा


1

एक ही परिणाम लेकिन थोड़ा क्लीनर (कोई स्ट्रिंग संघनन / स्वरूपण):

public static Uri GetBaseUrl(this UrlHelper url)
{
    Uri contextUri = new Uri(url.RequestContext.HttpContext.Request.Url, url.RequestContext.HttpContext.Request.RawUrl);
    UriBuilder realmUri = new UriBuilder(contextUri) { Path = url.RequestContext.HttpContext.Request.ApplicationPath, Query = null, Fragment = null };
    return realmUri.Uri;
}

public static string ActionAbsolute(this UrlHelper url, string actionName, string controllerName)
{
    return new Uri(GetBaseUrl(url), url.Action(actionName, controllerName)).AbsoluteUri;
}

0

शायद यह (?):

<%= 
  Request.Url.GetLeftPart(UriPartial.Authority) + 
  Url.Action("Action1", "Controller2", new {param1="bla", param2="blabla" })
%>

0

env: डॉटनेट कोर संस्करण 1.0.4

Url.Action("Join",null, null,Context.Request.IsHttps?"https":"http");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.