我的HtmlHelper出了什么问题?

时间:2010-06-06 16:45:43

标签: asp.net-mvc html-helper

我在Helper类中创建了一个Html扩展方法,但我无法让它工作。我已经实现了它,就像在不同的教程上看到的那样。

我的MenuItemHelper静态类:

public static string MenuItem(this HtmlHelper helper, string linkText, string actionName, string controllerName)
    {
        var currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
        var currentActionName = (string)helper.ViewContext.RouteData.Values["action"];

        var sb = new StringBuilder();

        if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) && currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase))
            sb.Append("<li class=\"selected\">");
        else
            sb.Append("<li>");

        sb.Append(helper.ActionLink(linkText, actionName, controllerName));
        sb.Append("</li>");
        return sb.ToString();
    }

导入命名空间

<%@ Import Namespace="MYAPP.Web.App.Helpers" %>

在我的master.page上实施

<%= Html.MenuItem("TEST LINK", "About", "Site") %> 

我得到的错误消息:

  

找不到方法:'System.String System.Web.Mvc.Html.LinkExtensions.ActionLink(System.Web.Mvc.HtmlHelper,System.String,System.String,System.String)

修改 好像问题是应用程序名称。 该文件夹名为MYAPP-MVC.Web,但在类中它转换为MYAPP_MVC.Web

我刚刚尝试了一个新的应用程序,它可以正常工作

2 个答案:

答案 0 :(得分:11)

尝试以更多ASP.NET MVCish 2.0样式重写助手。另外,不要忘记在帮助程序命名空间中使用System.Web.Mvc.Html添加,以便您可以访问ActionLink方法:

namespace MYAPP.Web.App.Helpers
{
    using System.Web.Mvc;
    using System.Web.Mvc.Html;

    public static class HtmlExtensions
    {
        public static MvcHtmlString MenuItem(this HtmlHelper helper, string linkText, string actionName, string controllerName)
        {
            var currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
            var currentActionName = (string)helper.ViewContext.RouteData.Values["action"];

            var li = new TagBuilder("li");
            if (string.Equals(currentControllerName, controllerName, StringComparison.CurrentCultureIgnoreCase) &&
                string.Equals(currentActionName, actionName, StringComparison.CurrentCultureIgnoreCase))
            {
                li.AddCssClass("selected");
            }

            li.InnerHtml = helper.ActionLink(linkText, actionName, controllerName).ToHtmlString();
            return MvcHtmlString.Create(li.ToString());
        }
    }
}

如果这不起作用,您肯定会遇到使用System.Web.Mvc程序集的某些版本问题。

答案 1 :(得分:0)

您需要使扩展方法可用于页面/视图页面。您可以通过在其顶部添加指令来为单个页面执行此操作

<%@ Import namespace="Namespace.Where.Your.HtmlHelper.Extension.Is.Defined" %>

或者您可以通过将其添加到

使其可用于所有页面
<pages> 
    <namespaces>
        <add namespace="Namespace.Where.Your.HtmlHelper.Extension.Is.Defined" />
    </namespaces>
</pages>
web.config中的

部分。

修改

问题可能与HtmlHelper.ActionLink()返回MvcHtmlString而不是string这一事实有关。我认为在使用ToString()调用追加时,您应该在其上调用StringBuilder。正如已经指出的那样,理想情况下,您应该返回MvcHtmlString,以便其他人可以使用<%: ... %>语法的扩展方法,而不会再次编码输出。