MVC3教程HtmlHelper无法正常工作

时间:2011-03-10 22:20:12

标签: asp.net-mvc asp.net-mvc-3 razor

我遇到了MVC3 MusicStore教程的问题。它使用Truncate方法定义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>一起使用

然而,编译器告诉我没有这样的方法(Truncate)存在,并且似乎在IEnumerable [MvcMusicStore.Models.Album](这是我的模型)而不是在我的HtmlHelpers类上寻找Truncate。

(注意上面的方括号在我的代码中实际上是有角度的括号,无法逃脱它们)

有人可以告诉我,我做错了吗?

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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 Dimitrov提出了一个很好的观点 - 你应该真正重新审视MvcHtmlString的实例。

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

答案 2 :(得分:0)

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

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