[asp.net-mvc] Razor 선언적 뷰에서 MVC HtmlHelper 확장 사용

MVC 3 RTM 프로젝트에 대한 App_Code 폴더에 Razor 선언적 도우미를 만들려고했습니다.

내가 만난 문제는 ActionLink와 같은 MVC HtmlHelper 확장을 사용할 수 없다는 것입니다. 이 컴파일 된 헬퍼에서 파생 때문이다 System.Web.WebPages.HelperPage, 그리고 그것이 노출하지만 Html속성을 해당 유형의 System.Web.WebPages.HtmlHelper것이 아니라 System.Web.Mvc.HtmlHelper.

내가받은 오류의 예는 다음과 같습니다.

‘System.Web.Mvc.HtmlHelper’에 ‘ActionLink’에 대한 정의가 포함되어 있지 않으며 ‘System.Web.Mvc.HtmlHelper’유형의 첫 번째 인수를 허용하는 확장 메서드 ‘ActionLink’를 찾을 수 없습니다 (using 지시문이 누락 되었습니까? 또는 어셈블리 참조?)

내 유일한 해결책은 나만의 HelperPage를 만들고 Html 속성을 재정의하는 것입니다.

using System.Web.WebPages;

public class HelperPage : System.Web.WebPages.HelperPage
{
    // Workaround - exposes the MVC HtmlHelper instead of the normal helper
    public static new HtmlHelper Html
    {
        get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }
    }
}

그런 다음 모든 도우미의 맨 위에 다음을 작성해야합니다.

@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html

@helper DoSomething()
{
    @Html.ActionLink("Index", "Home")
}

MVC 3에서 이렇게 힘들다는 뜻인가요, 아니면 제가 뭔가 잘못하고 있나요?



답변

이 질문에 대한 Marcind의 답변 을 살펴보십시오 . 경험하는 것은 App_Code폴더 에 선언적 뷰를 넣는 제한 사항입니다 .

도우미를 App_Code에 넣는 것은 작동하지만 특정 MVC 시나리오에 영향을주는 특정 제한 사항이 있습니다 (예 : 표준 MVC Html 도우미에 대한 액세스 권한 없음).


답변

페이지 도우미에 액세스 할 수 있도록 WebPages 도우미에 대한 확장 메서드를 만들었습니다.

public static HtmlHelper GetPageHelper(this System.Web.WebPages.Html.HtmlHelper html)
{
 return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html;
}


답변

Omar가 여기에 정답을 얻었지만 뭔가 추가하고 싶었습니다 (Omar의 응답을 답으로 표시해도됩니다).

우리는 v1에서 이것을 알고 있었고 제품에서 큰 수정을 할 수 없었지만 David Ebbo (ASP.Net 팀의 설계자)는 기본적으로 첫 번째 탐색 인 Visual Studio 코드 생성기 샘플을 게시했습니다. 이 작업이 제대로 작동하도록하기 위해 우리가보고있는 종류의 아이디어 : http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries .aspx

그것을 시도하고 당신이 생각하는 것을보십시오! 블로그에 댓글이 있으면 David에게 알려주세요.


답변

@Jakes 답변과 유사합니다.

public static class MvcIntrinsics {
    public static System.Web.Mvc.HtmlHelper Html {
        get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html; }
    }

    public static System.Web.Mvc.AjaxHelper Ajax {
        get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Ajax; }
    }

    public static System.Web.Mvc.UrlHelper Url {
        get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Url; }
    }

}

용법:

@MvcIntrinsics.Html.Raw("test")

출처 : Dino Esposito-프로그래밍 Microsoft ASP.NET MVC


답변

대체 솔루션 :

면도기 도우미 파일 위에 다음을 추가하십시오.

@functions {
    public static System.Web.Mvc.HtmlHelper<object> HHtml = ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html;
}

다음과 같이 호출하십시오.

@HHtml.ActionLink("actionname")


답변

이에 대한 나의 접근 방식은 단순히 페이지를 도우미 메서드에 매개 변수로 전달하는 것입니다. 따라서 귀하의 예에서는 다음과 같습니다.

@helper DoSomething(WebViewPage page)
{
    @page.Html.ActionLink("Index", "Home")
}

그런 다음 필요한 Razor 뷰에서 다음과 같이 호출합니다.

@YourHelperFilename.DoSomething(this)

이렇게하면 즉시 당신에게 같은 페이지 속성에 액세스 할 수 있습니다 Html또는 Url당신이 일반적으로 가지고 (그리고를 통해 그 HtmlHelper확장).

추가 혜택 (필요한 경우)으로 페이지의 ViewData.


답변

검색 자의 이익을 위해 클래스 라이브러리의 일부로 MVC 뷰를 만들 때 (구성 요소 재사용을 위해) 동일한 오류가 발생했습니다. 부분적으로 위에서 언급 한 해결책은 .cshtml 파일의 맨 위에 다음 using 문을 추가하는 것입니다.

@using System.Web.Mvc
@using System.Web.Mvc.Html

추가 작업이 필요하지 않습니다.