C# 使用NHaml的HtmlHelper中缺少扩展方法

C# 使用NHaml的HtmlHelper中缺少扩展方法,c#,asp.net-mvc-2,nhaml,C#,Asp.net Mvc 2,Nhaml,几天前我发现了NHaml,这是一个伟大的项目 当我尝试使用MVC2 Html帮助程序时,比如Html.LabelFor()、Html.TextBoxFor();视图无法编译 例如: error CS1061: 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'LabelFor' and no extension method 'LabelFor' accepting a first argument of type 'S

几天前我发现了NHaml,这是一个伟大的项目

当我尝试使用MVC2 Html帮助程序时,比如Html.LabelFor()、Html.TextBoxFor();视图无法编译

例如:

error CS1061: 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'LabelFor' and no extension method 'LabelFor' accepting a first argument of type 'System.Web.Mvc.HtmlHelper' could be found (are you missing a using directive or an assembly reference?)
0185:         textWriter.Write("              ");
0185:         textWriter.Write(Convert.ToString(Html.LabelFor(model => model.Username)));
0187:         textWriter.WriteLine();

error CS1061: 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'TextBoxFor' and no extension method 'TextBoxFor' accepting a first argument of type 'System.Web.Mvc.HtmlHelper' could be found (are you missing a using directive or an assembly reference?)
0194:         textWriter.Write("              ");
0194:         textWriter.Write(Convert.ToString(Html.TextBoxFor(model => model.Username)));
0196:         textWriter.WriteLine();
我试图在nhaml的Web.config部分添加程序集和名称空间,但它没有改变任何东西

我正在使用:

  • System.Web.Mvc 2.0
  • .NET Framework 3.5 SP1
  • 来自git trunk的NHAML1.5.0.2(并尝试了其他版本)
我的NHaml配置是:

<nhaml autoRecompile="true" templateCompiler="CSharp3" encodeHtml="false" useTabs="false" indentSize="2">

看起来您遇到了程序集引用问题


您可能引用的是MVC 1.0程序集,而不是2.0程序集?

据我所知,新的MVC帮助程序不受支持,实际上只有数量有限的HTMLHelper即LinkExtensions。粗略猜测,您可以尝试将LabelExtensions添加到
NHaml.Web.Mvc/nhamlmmvcviewengine.cs
文件中的NHaml viewengine设置中(因为您有源代码),并检查其是否有效

private void InitializeTemplateEngine()
{

 // snip
_templateEngine.Options.AddReference( typeof( LabelExtensions ).Assembly.Location ); // Line 50
}

问题是view类包含非泛型的HtmlHelper。或者一些新的扩展方法需要ViewData.Model的类型

要更正此问题,请更改NHaml.Web.Mvc/NHamlMvcView.cs中的属性和实例化

//public HtmlHelper Html { get; protected set; } // line 42
public HtmlHelper<TModel> Html { get; protected set; }

//Html = new HtmlHelper( viewContext, this ); // line 37
Html = new HtmlHelper<TModel>( viewContext, this );
//公共HtmlHelper Html{get;protected set;}//第42行
公共HtmlHelper Html{get;protected set;}
//Html=新的HtmlHelper(viewContext,this);//第37行
Html=新的HtmlHelper(viewContext,this);

重新生成并使用:)

NHaml项目和Web项目中的两个引用都是System.Web.Mvc 2.0.0.0。为了确认,我在视图中添加了一个简单的代码:%p=Html.GetType()。程序集输出为“System.Web.Mvc,Version=2.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”从“\BIN”文件夹中删除所有程序集,然后重试。当您进行构建时,MVC会将正确的程序集放回该文件夹中。旧的程序集可能仍在该文件夹中,并且可能以某种方式引用它。以前在MVC1.0和其他第三方程序集上也有类似的问题。任何地方都没有MVC 1.0程序集(我的机器上甚至没有安装它)。标准的Html.Label方法有效吗?似乎只有带有表达式类型参数的扩展方法缺少。这可能是缺少的名称空间吗?我刚刚发现带有标准视图引擎的标准HtmlHelper是通用的;一个不是!好的,我找到了。让我来做一些测试,我会自己回答的。谢谢你们。我已经用最新的git源代码试过了。我想我会深入了解源代码,以了解LinkExtensions是如何实现的。