【问题标题】:HTML helper class method not workingHTML 帮助程序类方法不起作用
【发布时间】:2012-04-05 14:06:34
【问题描述】:

我被 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>

【问题讨论】:

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


    【解决方案1】:

    您正在将动态值传递给扩展方法。 (将鼠标悬停在 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
    

    【讨论】:

    • 这有效... @Html.PageLinks((SportsStore.WebUI.Models.PagingInfo)Model.PagingInfo, x => Url.Action("List", new {page = x}))
    • 我添加了@using SportsStore.WebUI.Models,它使您的示例工作。感谢您的帮助!
    • 请将相关信息编辑到问题和/或答案中,如果有必要,甚至发布带有新细节的新答案。问题/答案的评论部分仅用于提供有关手头实际帖子的相关信息,例如错误、要求更多详细信息等,而不是长时间讨论,即使它们可能对相关人员有所帮助。如果您需要继续讨论,请考虑将其带到聊天室。
    • @LasseV.Karlsen 问题和答案已经更改,但是我确实删除了所有的 cmets,因为它们没有必要,我尝试聊天,但 OP 没有足够的积分聊天......所以我们使用我们拥有的东西
    • @Lasse V. Karlsen - 我也删除了我的 cmets,并且希望像 Justin 那样聊天。我确实留下了两个我认为对于其他人在这个问题上苦苦挣扎的必要条件。
    【解决方案2】:

    添加@using project_name.HtmlHelpers 例如

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

    【讨论】:

      【解决方案3】:

      您必须在 web.cofig 中的 Views 文件夹下添加此行,而不是主文件夹

        <add namespace="YourProjectName.HtmlHelpers"/>
      

      【讨论】:

        猜你喜欢
        • 2013-07-13
        • 2020-04-25
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多