HTML帮助器类方法不起作用

时间:2012-03-21 03:10:32

标签: asp.net-mvc asp.net-mvc-3 html-helper

我陷入了Steven Sanderson / Adum Freeman Pro ASP .Net MVC 3的参考书中。我已经完成了第185页,其中使用HTML帮助程序返回链接中页面的数量。我在这个网站上找到了帮助,解决了我在这本参考书中的问题,并逐步完成了仍然存在相同问题的每个步骤(链接)MVC extension method error

当我在浏览器中运行代码时出现此错误:

  

编译器错误消息:CS1973:' System.Web.Mvc.HtmlHelper'   没有适用的方法名称' PageLinks'但似乎有一个   该名称的扩展方法。扩展方法不能动态   出动。考虑转换动态参数或调用   没有扩展方法语法的扩展方法

代码构建正常,但如果我打开任何其他类来编辑这行代码到我的帮助方法得到与上面相同的错误。

@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new {page = x}))

助手班级:

namespace SportsStore.WebUI.HtmlHelpers
{
    public static class PagingHelpers
    {
        public static MvcHtmlString PageLinks(this HtmlHelper html, 
                                                PagingInfo pagingInfo, 
                                                Func<int, string> pageURL)
        {
            StringBuilder results = new StringBuilder();
            for (int i = 1; i <= pagingInfo.TotalPages; i++)
            {
                TagBuilder tag = new TagBuilder("a"); 
                tag.MergeAttribute("href", pageURL(i));
                tag.InnerHtml = i.ToString();
                if (i == pagingInfo.CurrentPage)
                    tag.AddCssClass("selected");
                results.Append(tag.ToString());
            }
            return MvcHtmlString.Create(results.ToString());
        }
    }
}

我的观点:

@{
    ViewBag.Title = "Products";
 }

@foreach (var p in Model.Products) { 
    <div class="item">
        <h3>@p.Name</h3>
        @p.Description
        <h4>@p.Price.ToString("c")</h4>
    </div>
}

<div class="pager">
    @Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new {page = x}))
</div>

的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="SportsStore.WebUI.HtmlHelpers"/> 
        </namespaces> 
     </pages> 
 </system.web.webPages.razor>

3 个答案:

答案 0 :(得分:3)

您正在将动态值传递给扩展方法。 (将鼠标悬停在Model.PagingInfo和intellisense上应该告诉你该类型是动态的。这意味着它直到运行时才知道该类型是什么)所以,尝试更改你的代码,以便它像这样投射动态类型:

@Html.PageLinks((PagingInfo)Model.PagingInfo, x => Url.Action("List", new {page = x}))

您可以通过其他两种方式解决此问题:

如错误所示,请勿使用扩展方法调用它:

PageLinks(Html, Model.PagingInfo, x => Url.Action("List", new {page = x}))

或者你可以让视图知道模型将会是什么,这样它就不会使用动态,通过在视图的顶部设置它

@model PagingInfo

答案 1 :(得分:0)

您必须在“视图文件夹”下的web.cofig中添加此行,而不是主要的

  <add namespace="YourProjectName.HtmlHelpers"/>

答案 2 :(得分:0)

使用project_name.HtmlHelpers添加@ 例如

@using ChristianSchool.HtmlHelpers
@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new { page = x, category = Model.CurrentCategory }))