HTML 도우미에서 URL 생성


168

일반적으로 ASP.NET 뷰에서 다음 함수를 사용하여 URL이 아닌 URL을 얻을 수 있습니다 <a>.

Url.Action("Action", "Controller");

그러나 사용자 정의 HTML 도우미에서 방법을 찾을 수 없습니다. 나는 가지고있다

public class MyCustomHelper
{
   public static string ExtensionMethod(this HtmlHelper helper)
   {
   }
}

헬퍼 변수에는 Action 및 GenerateLink 메소드가 있지만의 메소드를 생성합니다 <a>. ASP.NET MVC 소스 코드에서 파고 들었지만 간단한 방법을 찾을 수 없었습니다.

문제는 위의 Url이 뷰 클래스의 멤버이며 인스턴스화를 위해서는 컨텍스트와 경로 맵이 필요하다는 것입니다 (처리하고 싶지 않으며 어쨌든 안됩니다). 또는 HtmlHelper 클래스의 인스턴스에는 Url 인스턴스의 컨텍스트 정보 하위 집합 인 저녁 컨텍스트도 있습니다 (다시 처리하고 싶지는 않습니다).

요약하면, 가능하다고 생각하지만 내가 볼 수있는 모든 방법에는 다소 내부 ASP.NET 항목으로 조작하는 것이 포함되어 있기 때문에 더 좋은 방법이 있는지 궁금합니다.

편집 : 예를 들어, 내가 볼 수있는 한 가지 가능성은 다음과 같습니다.

public class MyCustomHelper
{
    public static string ExtensionMethod(this HtmlHelper helper)
    {
        UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
        urlHelper.Action("Action", "Controller");
    }
}

그러나 옳지 않은 것 같습니다. UrlHelper 인스턴스를 직접 다루고 싶지 않습니다. 더 쉬운 방법이 있어야합니다.


3
나는 이것이 간단한 예라는 것을 알고 있지만, 표시된 예에서는 HtmlHelper 대신 UrlHelper를 확장합니다. 그러나 실제 코드는 둘 다 필요할 수 있습니다.
Craig Stuntz

죄송합니다. 더 명확해야합니다. 확장 메서드에서 HTML 렌 디팅을하고 싶었고 URL을 생성해야했습니다.
Jan Zich

답변:


217

html helper extension 메소드에서 다음과 같이 url helper를 만들 수 있습니다.

var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var url = urlHelper.Action("Home", "Index")

2
생성자가 RouteCollection을 초기화하면 더 좋을 것이라고 생각합니다.new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection)
kpull1

22

UrlHelper공개 클래스와 정적 클래스를 사용하여 링크를 얻을 수도 있습니다 .

UrlHelper.GenerateUrl(null, actionName, controllerName, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true)

이 예제에서는 약간의 이점이있는 새로운 UrlHelper 클래스를 만들 필요가 없습니다.


RouteCollection을 설정하기 때문에이 답변이 더 좋습니다.
kpull1

10

여기에 점점 내 작은 확장 파일의 방법 UrlHelper(A)의 HtmlHelper인스턴스 :

  public static partial class UrlHelperExtensions
    {
        /// <summary>
        /// Gets UrlHelper for the HtmlHelper.
        /// </summary>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <returns></returns>
        public static UrlHelper UrlHelper(this HtmlHelper htmlHelper)
        {
            if (htmlHelper.ViewContext.Controller is Controller)
                return ((Controller)htmlHelper.ViewContext.Controller).Url;

            const string itemKey = "HtmlHelper_UrlHelper";

            if (htmlHelper.ViewContext.HttpContext.Items[itemKey] == null)
                htmlHelper.ViewContext.HttpContext.Items[itemKey] = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

            return (UrlHelper)htmlHelper.ViewContext.HttpContext.Items[itemKey];
        }
    }

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

public static MvcHtmlString RenderManagePrintLink(this HtmlHelper helper, )
{    
    var url = htmlHelper.UrlHelper().RouteUrl('routeName');
    //...
}

(저는 참고 용으로이 ans를 게시하고 있습니다)


기존 객체를 새로 작성하지 않고 재사용하므로 탁월한 접근 방식입니다.
Mike

ASP.NET 4.5를 사용하고 있으며 재진입 문제가 발생했습니다. 우리는 http 요청에서 UrlHelper를 재사용 할 수 있다고 생각하지 않습니다. 주의하십시오.
Carl in 't Veld
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.