在ASP.NET MVC 3应用程序中使用自定义html帮助程序

时间:2012-10-23 18:10:48

标签: c# asp.net asp.net-mvc razor

所以,几个小时以来,我一直在努力做一些我认为 - 而且仍然认为 - 应该是微不足道的事情。基本上,我创建了一个Html帮助器,我需要使用它来将一些CSS属性应用于ASP.NET MVC 3应用程序的选定菜单。这是我的Html助手:

namespace MVCUI.Extensibility
{
    public static class HtmlHelpers
    {
        public static MvcHtmlString MenuLink(
            this HtmlHelper helper, 
            string text, 
            string action, 
            string controller, 
            string selectedCssClass, 
            object routeValues, 
            object htmlAttributes)
        {
            var attributes = new RouteValueDictionary(htmlAttributes);

            if (!String.IsNullOrWhiteSpace(selectedCssClass))
            {
                var contextController = helper.ViewContext.RouteData.Values["controller"] as String ?? "Home";
                var contextAction = helper.ViewContext.RouteData.Values["action"] as String ?? "Index";

                if (String.Compare(
                    String.Format("{0}/{1}", controller, action), 
                    String.Format("{0}/{1}", contextController, contextAction), true) == 0)
                {
                    var cssValue = String.Empty;
                    if (attributes.ContainsKey("class"))
                        cssValue = attributes["class"] as String ?? String.Empty;
                    cssValue = cssValue.Trim();
                    if (cssValue.Length > 0)
                        cssValue = cssValue += (" " + selectedCssClass);
                    else
                        cssValue = selectedCssClass;
                    attributes["class"] = cssValue;
                }
            }

            return helper.ActionLink(text, action, controller, new RouteValueDictionary(routeValues), attributes);
        }
    }
}

以下是我在 _Layout.cshtml 文件中使用它的方法:

@Html.MenuLink("Posts", "Posts", "Post", "selected", new { }, new { })

由于一些非常奇怪的原因,我不断收到错误:

说明: 在编译为此请求提供服务所需的资源期间发生错误。请查看以下特定错误详细信息并相应地修改源代码。

编译器错误消息: CS1061:'System.Web.Mvc.HtmlHelper'不包含'MenuLink'的定义,也没有扩展方法'MenuLink'接受类型的第一个参数可以找到'System.Web.Mvc.HtmlHelper'(您是否缺少using指令或程序集引用?)

以下是我的尝试:

  1. 视图文件夹的根目录 Web.config 文件的<add namespace="MVCUI.Extensibility" />部分添加了<system.web.webPages.razor>/<pages>/<namespaces>
  2. _Layout.cshtml 文件的顶部添加了@using MVCUI.Extensibility;
  3. 尝试了上述(1)和(2)的所有组合。
  4. 尝试使用语法:@{ Html.MenuLink("Posts", "Posts", "Post", "selected", new { }, new { }); }
  5. 用Google搜索,很多!所有材料和资源,包括我们自己的stackoverflow,似乎都表明我做的是正确的。
  6. 甚至尝试在 AssemblyInfo.cs 中设置 [assembly:ComVisible(true)] 。好吧,以防万一! ;)
  7. 免责声明:这是我第一次在ASP.NET MVC 3应用程序中尝试html帮助程序。 我哪里可能出错?谢谢大家。

2 个答案:

答案 0 :(得分:1)

就像评论中指出的人一样,我的设置有些不同。在我的解决方案中,我已将项目的输出路径(包括MVC项目)从默认的bin\更改为..\Library\Build\。因为那个设置到目前为止工作正常,所以没有犯罪。

但是,这就是让我陷入困境的原因。在我恢复默认输出路径并重建我的项目后,Html帮助程序工作。即使我恢复了我的首选输出路径,它仍然继续工作 - 显然是因为bin文件夹中的dll已更新。

这意味着 .cshtml 文件中的@using MVCUI.Extensibility;语句和 Web.config 中的<add namespace="MVCUI.Extensibility" /> 引用了bin文件夹中没有定义HtmlHelper的旧的过时dll 。这仍然困扰着。我如何让他们在我想要的输出路径中引用dll?

无论如何,我只是觉得我应该发布有关经验和课程的信息,以防其他人发现自己遇到类似麻烦。谢谢大家。

答案 1 :(得分:0)

如果带有扩展名方法的文件显示using System.Web.WebPages(它有自己独立的HtmlHelper类)而不是using System.Web.Mvc,则会发生这种情况。