2011-03-10 47 views
3

我遇到了MVC3 MusicStore教程的问题。它使用Truncate方法定义了一个HtmlHelper。助手看起来是这样的:MVC3教程HtmlHelper不起作用

using System.Web.Mvc; 

namespace MusicStore.Helpers 
{ 
    public class HtmlHelpers 
    { 
     public static string Truncate(this HtmlHelper helper, string input, int length) 
     { 
      if (input.Length <= length) 
      { 
       return input; 
      } 
      else 
      { 
       return input.Substring(0, length) + "..."; 
      } 
     } 
    } 
} 

在视图中,我将其导入使用@using MusicStore.Helpers,然后尝试但是编译器告诉我没有这样的方法(截断)存在与<td>@Html.Truncate(item.Title, 25) </td>

使用它,而且似乎在IEnumerable [MvcMusicStore.Models.Album](这是我的模型)而不是我的HtmlHelpers类上寻找Truncate。

(NB的方括号以上是在我的代码确实尖括号,不可能逃脱他们)

谁能告诉我,我做错了什么吗?

回答

9

扩展方法应该在静态类中声明:

public static class HtmlHelpers 
{ 
    public static string Truncate(
     this HtmlHelper helper, 
     string input, 
     int length 
    ) 
    { 
     if (input.Length <= length) 
     { 
      return input; 
     } 
     return input.Substring(0, length) + "..."; 
    } 
} 

,然后在您的视图确保您已经引用包含静态类扩展方法的命名空间:

@using System.Web.Mvc 
... 
<td>@Html.Truncate(item.Title, 25)</td> 

或如果您希望帮助器在所有Razor视图中都可用,而无需添加using指令,则可以将相应的名称空间添加到~/Views/web.config文件的命名空间部分:

<system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="Namespace.Containig.Static.Class.With.Custom.Helpers" /> 
     </namespaces> 
    </pages> 
</system.web.webPages.razor> 
+0

+1和附注 - 我已经在MVC3中看到过HTML Helpers的IHtmlString的用法。我们应该在MVC3中使用它吗?我不确定其他类实现了这个接口。还是单元测试(嘲笑)我们这样做? – RPM1984 2011-03-10 22:28:18

+0

@ RPM1984,是的,你可以使用'IHtmlString'作为返回类型。这将是更正确的。这不是单元测试,因为它在这里是返回类型,所以我们不关心嘲笑它,它只是使用层次结构中更高级的类/接口的良好实践。 – 2011-03-10 22:30:53

+1

**不要返回IHtmlString **。这不是HTML,必须转义。 – SLaks 2011-03-10 22:36:48

0

扩展方法必须在静态类中定义。所以,你的代码更改为:

public static class HtmlHelpers 
{ 
    public static string Truncate(this HtmlHelper helper, string input, int length) 
    { 
     if (input.Length <= length) 
     { 
      return input; 
     } 
     else 
     { 
      return input.Substring(0, length) + "..."; 
     } 
    } 
} 

此外,@Darin季米特洛夫带来了一个好点 - 你真的应该retrun的MvcHtmlString一个实例。

在相关说明中,您可以通过web.config将命名空间导入到您的视图中 - 我建议您这样做,因此您不必在每一页都记住这一点。

+0

啊,谢谢你们俩(非常快!)。然后,教程中的完整解决方案似乎有点失败。首先,我忘了让我的类静态(oops),并且改变它返回一个MvcHtmlString也得到了帮助。尽管我不得不承认我不太了解args语法(这个HtmlHelper助手),但是我不需要指定当我在View中实际使用它时,args的数目是正确的,但我想这是框架通过的东西自动? – Richard 2011-03-10 22:30:10

+0

正是......它被称为“扩展方法” - 请参阅http://msdn.microsoft.com/en-us/library/bb383977.aspx&http://en.wikipedia.org/wiki/Extension_method – Charlino 2011-03-10 22:36:37

+1

* *不要返回IHtmlString **。这不是HTML,必须转义。 – SLaks 2011-03-10 22:38:13

0

您可能还想考虑将命名空间添加到web.config中。我知道我在多个页面上使用我的助手。记住在每个视图上添加using是一种痛苦。

<system.web> 
    <pages> 
    <namespaces> 
     <add namespace="MusicStore.Helpers"/> 
    </namespaces> 
    </pages> 
</system.web>