ASP.NET MVC'de bir eylemin mutlak URL'sini nasıl bulabilirim?


239

Bunun gibi bir şey yapmam gerekiyor:

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

MVC'nin Beta sürümünü kullanıyorum, ancak bir eylemin mutlak URL'sini nasıl alacağımı anlayamıyorum. Böyle bir şey yapmak istiyorum:

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

Bunun için bir yardımcı veya Sayfa yöntemi var mı?

Yanıtlar:


480

Daha fazla bilgi için burayı tıklayın , ancak esenten uzatma yöntemlerine gerek yoktur. Zaten pişmiş, sadece sezgisel bir şekilde değil.

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

6
İlginç, bu yüzden protokolü belirtirseniz, URL mutlaktır
Casebash

24
Bu cevap daha iyi, bu şekilde Resharper yine de Eylem ve Denetleyicinin varlığını doğrulayabilir. Ben http yerine Request.Url.Scheme kullanımını öneririz, bu şekilde http ve https her ikisi de desteklenmektedir.
Pbirkoff

2
@Pbirkoff, bunun en iyi cevap olduğunu kabul edin, ancak parametrelerin eylemleri / denetleyicileri temsil ettiğini bilmesi için ReSharper için kendi yöntemlerinize açıklama ekleyebileceğinizi bilmek isteyebilirsiniz. Bu şekilde R #, sağladığınız dizeleri yine de doğruladığı gibi doğrulayabilir.
Drew Noakes

3
Küçük bir iyileşme yerine olabilir "http" ile Request.Url.SchemeHTTPS kullanan oluşturulan URL HTTPS kullanacaksanız böylece.
Erik Schierboom

1
Bu da işe Html.ActionLinkyarar (bir protokol alan yöntemlerden herhangi biri, örneğin MVC 4'te son 2)
Chris

74

UrlHelper'ı genişletin

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

O zaman böyle söyle

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

DÜZENLEME - RESHARPER DUYURULARI

Kabul edilen cevapta en çok oylanan yorum şudur: This answer is the better one, this way Resharper can still validate that the Action and Controller exists.İşte aynı davranışı nasıl elde edebileceğinize bir örnek.

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

Destekleyici bilgi:


3
Bu çözüm için isteğe bağlı parametreler de eklerdim. Bu tüm vakaları kapsamalıdır.
Eugeniu Torica

Çok hoş! Bu kodu kullandım ama arayanın istedikleri Url yöntemini (yönlendirici değerleri vb.) Kullanarak oluşturabilmesi için tek değişken relativeUrl yaptım ve yönteminiz göreceli yapmaktan sorumlu olabilir. Benimki: AbsoluteUrl (bu UrlHelper url'si, string relativeUrl).
Rob Kent

26
<%= Url.Action("About", "Home", null, Request.Url.Scheme) %>
<%= Url.RouteUrl("Default", new { Action = "About" }, Request.Url.Scheme) %>

21

@Charlino'nun cevabını rehber olarak kullanarak, bununla geldim.

UrlHelper için ASP.NET MVC belgeleri bir ana makine adı ve protokol geçirilen eğer Url.Action tam olarak nitelenmiş URL döneceğini. Ben ana bilgisayar adını ve protokol zorlamak için bu yardımcıları oluşturulan gösterileri sağlanacak. Birden fazla aşırı yük, Url için aşırı yükleri yansıtır:

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
Kod için teşekkürler, bana çok yardımcı oldu, ancak bu çözümde genellikle geliştirme sırasında ortaya çıkan bir sorun var. Site belirli bir bağlantı noktasında barındırılıyorsa, bağlantı noktası bilgileri localhost: 4423 gibi requestUrl.Authority'ye eklenir . Nedense, Action yöntemi bağlantı noktasını tekrar ekler. Yani bu Eylem Yöntemi'nin içindeki bir hatadır ya da bağlantı noktasını buraya sağlamanız gerekmez. Peki, istekte bulunan Özelliklerden hangisi doğru olanıdır (DnsSafeHost veya Host)? Çözüm oldukça basit: null değerini sağlayın ve Action yöntemi doğru değeri dolduracaktır.
ntziolis

@ Ntziolis'in önerisini dahil etmek için cevabı güncelledim.
Andrew Arnott

3

Bunu yapmak için bir yerleşik olup olmadığından emin değilim, ama kendi HtmlHelper yönteminizi yuvarlayabilirsiniz.

Aşağıdaki gibi bir şey

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

O zaman böyle söyle

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

HTH'ler, Charles


2

Argümanlarla tam cevap:

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

ve bu mutlak bir url üretecek


1

Aynı sonuç ama biraz daha temiz (dize birleştirme / biçimlendirme yok):

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

Belki bu (?):

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

0

env: dotnet çekirdek sürüm 1.0.4

Url.Action("Join",null, null,Context.Request.IsHttps?"https":"http");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.