2

所以,几个小时以来,我一直在尝试做一些我认为——而且仍然认为——应该是微不足道的事情。基本上,我创建了一个 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”的定义,并且找不到接受“System.Web.Mvc.HtmlHelper”类型的第一个参数的扩展方法“MenuLink”(您是否缺少 using 指令或程序集引用?)

这是我尝试过的:

  1. 添加<add namespace="MVCUI.Extensibility" />Views文件夹根目录下的Web.config<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. 谷歌搜索,很多!所有材料和资源,包括我们自己的 stackoverflow,似乎都表明我在做正确的事情。
  6. 甚至尝试在AssemblyInfo.cs中设置[assembly: ComVisible(true)]。好吧,以防万一!;)

免责声明:这是我第一次在 ASP.NET MVC 3 应用程序中尝试使用 html 助手。我哪里会出错?谢谢人们。

4

2 回答 2

1

就像有人在评论中指出的那样,我的设置有些不同。在我的解决方案中,我已将我的项目(包括 MVC 项目)的输出路径bin\从默认更改为..\Library\Build\. 到目前为止,该设置运行良好,因此没有犯罪。

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

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

无论如何,我只是想我应该发布有关经验和教训的信息,以防其他人遇到类似的麻烦。谢谢人们。

于 2012-10-23T21:55:49.627 回答
0

如果具有扩展方法的文件说using System.Web.WebPages(它有自己的单独HtmlHelper类)而不是using System.Web.Mvc.

于 2012-10-23T18:12:23.317 回答