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
흥미
롭기

24
이 답변은 Resharper가 여전히 액션과 컨트롤러가 존재하는지 확인할 수있는 더 나은 방법입니다. http 대신 https와 https가 모두 지원되는 방식으로 http 대신 Request.Url.Scheme을 사용하는 것이 좋습니다.
Pbirkoff

2
@Pbirkoff, 이것이 최선의 답변이라는 데 동의하지만 매개 변수가 동작 / 컨트롤러를 나타내는 것을 ReSharper에 고유 한 방법으로 주석을 달 수 있음을 알고 싶습니다. 이런 식으로 R #은 여전히 ​​제공하는 문자열의 유효성을 검사 할 수 있습니다.
Drew Noakes

3
작은 개선은 대체 될 수있다 "HTTP"를 함께 Request.Url.SchemeHTTPS를 사용 생성 된 URL은 또한 HTTPS를 사용하는 경우 그래서.
Erik Schierboom

1
이것은 Html.ActionLink잘 작동합니다 (예를 들어 프로토콜을 취하는 모든 방법, 예를 들어 MVC 4의 마지막 2 개)
Chris

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")%>

편집-리 사이퍼 설명

허용되는 답변에 대해 가장 많이 언급 된 의견 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
이 솔루션에 대한 선택적 매개 변수도 추가합니다. 모든 경우에 적용됩니다.
Eugeniu Torica 14 년

아주 좋아요! 이 코드를 사용했지만 호출자가 원하는 Url 메서드 (라우터 값 등)를 사용하여 만들 수 있도록 relativeUrl 인수 만 만들었습니다. 그래서 내 것입니다 : AbsoluteUrl (이 UrlHelper URL, 문자열 relativeUrl).
Rob Kent

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

21

@Charlino의 답변을 가이드로 사용하여 이것을 생각해 냈습니다.

UrlHelper에 대한 ASP.NET MVC 문서 호스트 이름과 프로토콜에 전달되는 경우 Url.Action는 정규화 된 URL을 반환 것이다. 나는 호스트 이름과 프로토콜을 강제로 이러한 헬퍼를 만들어 쇼를 제공한다. 다중 과부하는 Url의 과부하를 미러링합니다.

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는 많은 도움이되었지만 일반적으로 개발 중에 발생하는이 솔루션에 문제가 있습니다. 사이트가 특정 포트에서 호스팅되는 경우 포트 정보는 localhost : 4423 과 같은 requestUrl.Authority에 포함됩니다 . 어떤 이유로 Action 메소드는 포트를 다시 추가합니다. 따라서 이것은 Action Method 내부의 버그이거나 여기에 포트를 제공하지 않아야합니다. 그러나 요청시 사용 가능한 속성 중 올바른 속성은 무엇입니까 (DnsSafeHost 또는 Host)? 해결책은 간단합니다. null 을 제공하면 Action 메소드가 올바른 값을 채 웁니다.
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"))%> »

찰스


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");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.