2013-06-06 3 views
5

도우미를 만들려고하는 MVC4 프로젝트가 있습니다. "App_Code"라는 폴더를 추가했으며 그 폴더에 MyHelpers.cshtml이라는 파일을 추가했습니다. 여기에 해당 파일의 전체 내용은 다음과 같습니다'Url'이름이 현재 컨텍스트 오류에 없습니다.

@helper MakeButton(string linkText, string actionName, string controllerName, string iconName, string classes) { 
    <a href='@Url.Action(linkText,actionName,controllerName)' class="btn @classes">Primary link</a> 
} 

나는 "청소"와 솔루션을 구축

(내가이 고정 얻을 후 나는 그 이상으로거야, 일부 사용되지 않는 PARAMS이 알고있다) , 오류 없음.

도우미를 사용하는 페이지에서이 코드를 추가했습니다.

@MyHelpers.MakeButton("Back","CreateOffer","Merchant","","btn-primary") 

내가 프로젝트를 실행하려고하면, 나는 다음과 같은 오류 얻을 :

Compiler Error Message: CS0103: The name 'Url' does not exist in the current context

내가 이것을 쓸 수있는 올바른 방법을 찾을 수 없습니다 - 내가 잘못하고있는 중이 야 무엇을? 웹에서 본 예와 비교하면 정확하다고 보십니까?

+2

다음과 같이해야한다고 생각합니다. http://stackoverflow.com/questions/4710853/using-mvc-htmlhelper-extensions-from-razor-declarative-views. – JeffB

+0

'@ Url.Action'보다는'@Html.ActionLink'를 사용하셨습니까? 둘에 대한 내 대답에 각주를 달았습니다. –

답변

4

JeffB의 링크에서 알 수 있듯이 도우미 파일은 UrlHelper 개체에 액세스 할 수 없습니다.

using System.Web.WebPages; 
using System.Web.Mvc; 

namespace MyProject 
{ 
    public class HelperBase : HelperPage 
    { 
     public static new HtmlHelper Html 
     { 
      get { return ((WebViewPage)WebPageContext.Current.Page).Html; } 
     } 
     public static System.Web.Mvc.UrlHelper Url 
     { 
      get { return ((WebViewPage)WebPageContext.Current.Page).Url; } 
     } 
    } 
} 

그리고 내 도우미에 내가 (예를 들어 당신을 사용하는)을 수행합니다 : 나는 기본 클래스를 만들어 내 도우미를 들어

@helper MakeButton(string linkText, string actionName, 
    string controllerName, string iconName, string classes) { 

    System.Web.Mvc.UrlHelper urlHelper = 
     new System.Web.Mvc.UrlHelper(Request.RequestContext); 
    <a href='@urlHelper.Action(linkText,actionName,controllerName)' 
     class="btn @classes">Primary link</a> 
} 
4

:

는 예를 들어 수정입니다

또한
@inherits MyProject.HelperBase 
@using System.Web.Mvc 
@using System.Web.Mvc.Html 

@helper MakeButton(string linkText, string actionName, string controllerName, string iconName, string classes) { 
    <a href='@Html.ActionLink(linkText,actionName,controllerName)' class="btn @classes">Primary link</a> 
} 

, 당신은 당신이 (LinkExtensions 통해) @Html.ActionLink를 사용하는 의미 대신,486,653하지 않았다 있습니다 210? 후자는 linkText, actionName, controllerName 과부하가없는 것 같습니다, 전자는 무엇입니까?

+0

기본 클래스가 훌륭합니다! 내가 필요한 것을 정확히 했니, 고마워. – Dan

+0

완벽하고 정확하게 내가 찾고 있던 것이 었습니다! – cuzzlor