使用NHaml在HtmlHelper中缺少扩展方法

时间:2010-07-09 19:14:13

标签: 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 '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的Nhaml 1.5.0.2(并试过其他版本)

我的NHaml配置是:

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

3 个答案:

答案 0 :(得分:1)

看起来你有一个程序集引用问题。

您可能正在引用MVC 1.0程序集而不是2.0程序集?

答案 1 :(得分:1)

问题是视图类包含非泛型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 );

重建和使用:)

答案 2 :(得分:0)

据我所知,新的MVC助手不受支持,实际上只有有限数量的HtmlHelper即LinkExtensions。作为一个疯狂的猜测,您可以尝试将LabelExtensions添加到NHaml.Web.Mvc/NHamlMvcViewEngine.cs文件中的NHaml视图引擎的设置中(因为您确实有源代码)并检查它是否有效。

private void InitializeTemplateEngine()
{

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