2012-03-21 111 views
3

我被困在由Steven Sanderson/Adum Freeman Pro ASP.Net MVC的参考书中。我已经完成了第185页,其中HTML帮助器将用于返回链接页面的数量。我发现在这个网站解决了我的问题与本参考书的帮助,并通过每一步都走了仍然有同样的问题(链接)MVC extension method errorHTML助手类方法不起作用

当我运行在浏览器的代码,我得到这个错误:

Compiler Error Message: CS1973: 'System.Web.Mvc.HtmlHelper' has no applicable method named 'PageLinks' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax

该代码生成的罚款,但如果我打开任何其他类来编辑这一行代码我的帮助方法获得上述相同的错误。

@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

你传递一个动态值的扩展方法。 (将鼠标悬停在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})) 

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

@model PagingInfo 
+0

这个工作... @ Html.PageLinks((SportsStore.WebUI.Models.PagingInfo)型号.PagingInfo,x => Url.Action(“List”,new {page = x})) – Shawn 2012-03-21 04:50:35

+0

我添加了@using SportsStore.WebUI.Models,它使您的示例工作。谢谢你的帮助! – Shawn 2012-03-21 04:53:23

+0

请在相关问题和/或答案中编辑相关信息,或者在有新保证的情况下发布新答案。问题/回答的评论部分仅用于提供有关实际帖子的相关信息,如错误,更多详细信息的请求等,而不是长时间讨论,即使它们可能对所涉人员有所帮助。如果您需要继续讨论,请考虑将其交给聊天室。 – 2012-03-21 11:08:52

0

必须在web.cofig下查看添加此行没有文件夹主要的一个

<add namespace="YourProjectName.HtmlHelpers"/>