我遇到了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。
(注意上面的方括号在我的代码中实际上是有角度的括号,无法逃脱它们)
有人可以告诉我,我做错了吗?
答案 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>