Как найти абсолютный URL-адрес действия в ASP.NET MVC? - PullRequest
227 голосов
/ 12 января 2009

Мне нужно сделать что-то вроде этого:

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

Я использую бета-версию MVC, но не могу понять, как получить абсолютный URL-адрес действия. Я хотел бы сделать что-то вроде этого:

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

Есть ли для этого вспомогательный метод или метод Page?

Ответы [ 9 ]

459 голосов
/ 18 июня 2010

Нажмите здесь для получения дополнительной информации, но по существу нет необходимости в методах расширения. Он уже запечен, но не очень интуитивно.

Url.Action("Action", null, null, Request.Url.Scheme);
71 голосов
/ 12 января 2009

Расширение 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")%>

РЕДАКТИРОВАТЬ - РЕШАРПЕРНЫЕ АННОТАЦИИ

Самый одобренный комментарий к принятому ответу: 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;
        }
    }
}

Вспомогательная информация:

26 голосов
/ 02 июля 2010
<%= Url.Action("About", "Home", null, Request.Url.Scheme) %>
<%= Url.RouteUrl("Default", new { Action = "About" }, Request.Url.Scheme) %>
21 голосов
/ 17 марта 2009

Использование Ответ @Charlino как руководства, я придумал это.

Документация ASP.NET MVC для UrlHelper показывает, что Url.Action вернет полный URL-адрес, если передано имя хоста и протокол. Я создал эти помощники, чтобы заставить имя хоста и протокол быть предоставлена. Многократные перегрузки отражают перегрузки для 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);
        }

    }
}
3 голосов
/ 12 января 2009

Я не уверен, есть ли встроенный способ сделать это, но вы можете использовать свой собственный метод 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"))%> »

HTHS, Charles

2 голосов
/ 17 января 2018

Полный ответ с аргументами будет:

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

и это даст абсолютный URL

1 голос
/ 12 января 2009

Тот же результат, но немного чище (без объединения / форматирования строк):

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 голосов
/ 30 августа 2017

env: версия ядра dotnet 1.0.4

Url.Action("Join",null, null,Context.Request.IsHttps?"https":"http");
0 голосов
/ 23 ноября 2009

Может быть, это (?):

<%= 
  Request.Url.GetLeftPart(UriPartial.Authority) + 
  Url.Action("Action1", "Controller2", new {param1="bla", param2="blabla" })
%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...