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
추가 작업이 필요하지 않습니다.