5

我有一个 MVC4 项目,我正在尝试为其创建一个助手。我添加了一个名为“App_Code”的文件夹,并在该文件夹中添加了一个名为 MyHelpers.cshtml 的文件。以下是该文件的全部内容:

@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>
}

(我知道有一些未使用的参数,我会在修复后得到这些)

我“清理”并构建了解决方案,没有错误。

在使用帮助程序的页面中,我添加了此代码。

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

当我尝试运行该项目时,出现以下错误:

编译器错误消息:CS0103:当前上下文中不存在名称“Url”

我似乎找不到正确的方法来写这个 - 我做错了什么?与我在网上看到的示例相比,这似乎是正确的?

4

2 回答 2

4

对于我的助手,我创建了一个基类:

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; }
        }
    }
}

然后在我的助手中(以你的为例):

@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>
}

另外,您确定您不是要使用@Html.ActionLink(via LinkExtensions) 代替@Url.Action吗?后者似乎没有linkText, actionName, controllerName过载,前者呢?

于 2013-06-06T06:19:13.117 回答
4

正如 JeffB 的链接所暗示的,您的帮助文件无权访问 UrlHelper 对象。

这是一个示例修复:

@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>
}
于 2013-06-06T06:10:25.727 回答