[C#] ASP.NET MVC에서 작업의 전체 URL 얻기


Answers

Paddy가 언급했듯이 : 사용할 프로토콜을 명시 적으로 지정하는 UrlHelper.Action() 의 오버로드를 사용하는 경우 생성 된 URL은 절대적이며 상대적인 것이 아니라 정규화 된 것입니다.

나는 UrlHelper 클래스사용하여 절대 액션 URL을 만드는 방법 이라는 블로그 포스트를 작성했다.이 클래스 에서는 가독성을 위해 사용자 정의 확장 메서드를 작성하는 것이 좋습니다.

/// <summary>
/// Generates a fully qualified URL to an action method by using
/// the specified action name, controller name and route values.
/// </summary>
/// <param name="url">The URL helper.</param>
/// <param name="actionName">The name of the action method.</param>
/// <param name="controllerName">The name of the controller.</param>
/// <param name="routeValues">The route values.</param>
/// <returns>The absolute URL.</returns>
public static string AbsoluteAction(this UrlHelper url,
    string actionName, string controllerName, object routeValues = null)
{
    string scheme = url.RequestContext.HttpContext.Request.Url.Scheme;

    return url.Action(actionName, controllerName, routeValues, scheme);
}

그런 다음보기에서 간단하게 사용할 수 있습니다.

@Url.AbsoluteAction("Action", "Controller")
Question

이 질문에는 이미 답변이 있습니다.

액션의 전체 URL을 가져 오는 기본 제공 방법이 있습니까?

GetFullUrl("Action", "Controller") 과 같은 것을 찾고 있는데 http://www.fred.com/Controller/Action 과 같은 것을 반환합니다.

내가 이것을 찾고있는 이유는 URL이 항상 사이트의 현재 위치에 상대적으로 생성 될 수 있도록 생성 된 자동화 된 전자 메일에서 URL을 하드 코딩하는 것을 피하기 위해서입니다.




이것은 내가 정말로 정말로 까다 롭다는 것일 수도 있지만, 한 번만 상수를 정의하는 것을 좋아합니다. 위에 정의 된 접근법 중 하나를 사용하면 활동 상수가 여러 번 정의됩니다.

이를 방지하려면 다음을 수행하십시오.

    public class Url
    {
        public string LocalUrl { get; }

        public Url(string localUrl)
        {
            LocalUrl = localUrl;
        }

        public override string ToString()
        {
            return LocalUrl;
        }
    }

    public abstract class Controller
    {
        public Url RootAction => new Url(GetUrl());

        protected abstract string Root { get; }

        public Url BuildAction(string actionName)
        {
            var localUrl = GetUrl() + "/" + actionName;
            return new Url(localUrl);
        }

        private string GetUrl()
        {
            if (Root == "")
            {
                return "";
            }

            return "/" + Root;
        }

        public override string ToString()
        {
            return GetUrl();
        }
    }

그런 다음 컨트롤러를 생성하십시오 (예 : DataController).

    public static readonly DataController Data = new DataController();
    public class DataController : Controller
    {
        public const string DogAction = "dog";
        public const string CatAction = "cat";
        public const string TurtleAction = "turtle";

        protected override string Root => "data";

        public Url Dog => BuildAction(DogAction);
        public Url Cat => BuildAction(CatAction);
        public Url Turtle => BuildAction(TurtleAction);
    }

다음과 같이 사용하십시오.

    // GET: Data/Cat
    [ActionName(ControllerRoutes.DataController.CatAction)]
    public ActionResult Etisys()
    {
        return View();
    }

그리고 .cshtml (또는 어떤 코드)

<ul>
    <li><a href="@ControllerRoutes.Data.Dog">Dog</a></li>
    <li><a href="@ControllerRoutes.Data.Cat">Cat</a></li>
</ul>

이것은 확실히 더 많은 일이지만, 컴파일 시간 유효성 검사가 내 편이라는 것을 쉽게 알 수 있습니다.




이 질문은 ASP .NET과 관련이 있습니다. 그러나 여러분 중 일부는 여러 상황에서 유익한 시스템 불가지론적인 자바 스크립트의 이점을 누리게 될 것이라고 확신합니다.

업데이트 : 페이지 자체 외부에 형성된 URL을 얻는 방법은 위의 답변에 잘 설명되어 있습니다.

또는 다음과 같은 oneliner를 할 수 있습니다.

new UrlHelper(actionExecutingContext.RequestContext).Action(
    "SessionTimeout", "Home", 
    new {area = string.Empty}, 
    actionExecutingContext.Request.Url!= null? 
    actionExecutingContext.Request.Url.Scheme : "http"
);

필터 또는

new UrlHelper(this.Request.RequestContext).Action(
    "Details", 
    "Journey", 
    new { area = productType }, 
    this.Request.Url!= null? this.Request.Url.Scheme : "http"
);

그러나 꽤 자주 Html.Action 사용하는 경우에 현재 페이지의 URL을 Html.Action 하며 내 이름이 나와있는 페이지 컨트롤러를 사용하는 것이 어색하다고 느낍니다. 그런 경우에는 대신 JavaScript를 사용하는 것이 좋습니다. 이것은 반쯤 다시 작성된 시스템에서 특히 유용합니다. MVT 절반 웹 폼 절반 VB 스크립트 절반 하나님은 현재 페이지의 URL을 얻으려면 매번 다른 방법을 사용해야합니다.

한 가지 방법은 JavaScript를 사용하여 URL을 가져 오는 것입니다. window.location.href another - document.URL




Links