我是ASP.NET MVC的新手,无法解决这个问题。通过Professional ASP.NET MVC 2中的Nerdinner示例,我复制了PaginatedList助手类,并决定对其进行改进,以便前向和后向链接可以由类中的方法生成,而不是在每个视图页面中写出。我从它所在的视图中复制了这个,Index.aspx:
if (Model.HasPreviousPage)
{
Response.Write(Html.RouteLink("<<<", "Users", new { page=(Model.PageIndex-1) }));
}
并使用它在Helpers \ PaginatedList.cs中创建此方法:
public string NavLinks()
{
if (HasPreviousPage)
{
return Html.RouteLink("<<<", "Users", new { page=(PageIndex-1) });
}
}
(HasPreviousPage是PaginatedList中的一个简单方法。)
直接它抱怨“当前上下文中不存在名称'Html',所以我修改它以获取参数:
public string NavLinks(HtmlHelper Html)
现在我得到''System.Web.Mvc.HtmlHelper'不包含'RouteLink'的定义,并且没有扩展方法'RouteLink'接受类型'System.Web.Mvc.HtmlHelper'的第一个参数' (您是否缺少using指令或程序集引用?)“。
根据关于LinkExtensions.RouteLink方法的Microsoft文档,“在Visual Basic和C#中,您可以将此方法作为HtmlHelper类型的任何对象上的实例方法”。他们撒谎吗?
帮助!
答案 0 :(得分:1)
如果您尝试将其设为HtmlHelper,只需更改
即可public string NavLinks(HtmlHelper Html)
{
if (HasPreviousPage)
{
return Html.RouteLink("<<<", "Users", new { page=(PageIndex-1) });
}
}
到
using System.Web.Mvc;
using System.Web.Mvc.Html;
public static MvcHtmlString NavLinks(this HtmlHelper html, hasPreviousPage)
{
if (hasPreviousPage)
{
return html.RouteLink("<<<", "Users", new { page=(PageIndex-1) });
}
}
Mvc中包含的所有HtmlHelper都是静态方法,并且它们在Asp.net MVC 2中返回一个MvcHtmlString。这将是HtmlHelper类的扩展方法。将这些引用添加到包含此扩展方法的代码文件后,您应该在其中看到RouteLink方法。
答案 1 :(得分:0)
@DeathBedMotorcade
这有帮助,但我不得不改变一些事情。
该方法不能是静态的,因为它需要访问对象的属性(同一类的一部分,PaginatedList),特别是HasPreviousPage方法和PageIndex变量。然后它给出了错误“扩展方法必须是静态的”。删除“this”关键字修复了该问题。所以我有:
public MvcHtmlString NavLinks(HtmlHelper html)
{
if (HasPreviousPage)
{
return html.RouteLink("<<<", "Users", new { page=(PageIndex-1) });
}
if (HasNextPage)
{
return html.RouteLink(">>>", "Users", new { page=(PageIndex+1) });
}
return null;
}
在视图中:
Response.Write(Model.NavLinks(Html))
虽然我没有完全理解为什么之前没有这样做的所有原因,但这都有效。
“使用System.Web.Mvc.Html”是关键,虽然我以为我在某个时候尝试过这个;可能在实现项目“Html”(一个隐式传递给视图的HtmlHelper对象?)之前需要传入.VS通常会提示缺少Using语句,但这次没有。
感谢。