【问题标题】:No overload for method 'Label' takes 3 arguments方法“标签”没有重载需要 3 个参数
【发布时间】:2012-12-14 16:54:53
【问题描述】:

我正在使用 ASP.Net MVC 3,已引用所有正确的 DLL(请参阅随附的屏幕截图),但由于某种原因,我收到了此编译错误。

【问题讨论】:

  • 这听起来很简单,但是您是否尝试过进行清理然后重新构建?你在一个全新的项目中也遇到同样的错误吗?
  • @keshav,我总是清理和重建。是的,它确实发生在一个全新的 ASP.Net MVC 3 项目中。
  • 对我来说,您的安装似乎有问题。你可以尝试重新安装...
  • @keshav,我刚刚重新安装,甚至强制应用程序将程序集复制到 bin 文件夹,同样的问题。它也发生在多种环境中。这不会发生在你身上吗?

标签: asp.net asp.net-mvc asp.net-mvc-3 overloading


【解决方案1】:

这是一个奇怪的事件。我能够重现您的错误。我还能够弄清楚它发生的原因以及如何绕过它。

为什么会发生

System.Web.Mvc.HtmlSystem.Web.WebPages.Html 之间存在命名空间冲突

碰撞的结果是什么

System.Web.Mvc.Html

这个命名空间包含方法的定义

LabelExtensions.Label (HtmlHelper, String, String)

您会注意到,这是先例并导致问题的命名空间。它只有两个重载。 (String)(String, String)。在测试时,这是唯一出现的选项。


如何绕过它

你真正想要的是这个命名空间

System.Web.WebPages.Html

这个命名空间包含方法的定义

HtmlHelper.Label (String, String, IDictionary<String, Object>)

您现在可以看到添加new { @class = "myClass" } 的可用性。

创建您自己的实例

获取自己的HtmlHelper 并绕过LabelExtension,如下所示:

剃须刀

@{
 var h = new System.Web.WebPages.Html.HtmlHelper();
}

asp

<% var h = new System.Web.WebPages.Html.HtmlHelper(); %>

确保它没有嵌套在 razor 或 &lt;%= 块内,因为它会阻止它可用。它需要在页面的全局级别。

使用正确的标签

现在你可以使用这个了:

剃须刀

@h.Label("firstName", "First Name", new { @class = "control-label" })

asp

&lt;%= h.Label("firstName", "First Name", new { @class = "control-label" }) %&gt;

【讨论】:

    【解决方案2】:

    在我看来,您从 Asp.Net Mvc 4 中选择了一个重载,然后编译器抱怨,因为它在 Asp.Net Mvc 3 中不存在>.

    查看这些链接以查看不同版本的 Asp.Net Mvc 中的 Html.Label(...) 重载:

    Asp.Net Mvc 2
    Asp.Net Mvc 3
    Asp.Net Mvc 4

    根据链接页面中的信息,您的 Visual Studio(出于某种原因)似乎正在为您提供基于 Asp.Net Mvc 4 的 Intellisense,但是当页面应该是使用编译的 Mvc 版本 3 并且您选择的重载不存在。

    不知道为什么 VS 从版本 4 开始提供 Intellisense...

    【讨论】:

    • 看起来正确,但我没有安装 MVC 4。我正在使用 VS2010 和 .net 3.5
    【解决方案3】:

    查看您的~/Views/Web.config

    看看有没有configuration/system.web/pages/namespaces节点

    尝试在其中添加&lt;add namespace="System.Web.Mvc.Html"/&gt;

    Label 方法位于上述命名空间中。看起来你的视图没有找到它。

    由于您不编译视图,因此它构建得很好。此外,您的智能感知从参考资料中得到了很好的方法。但是,这几乎就像您的视图在运行时没有获取该方法一样。

    虽然将上述命名空间添加到 web.config 中可能会解决问题,但它会隐藏您的应用程序中可能存在的更大问题。 “修复”应该为您提供进一步调试情况的起点。

    如果这解决了您的问题,请尝试将您的 web.config 文件与一个全新且未受影响的 MVC 项目进行比较。看看你有什么不同,这可能会阻止视图找到 Html Helper。

    【讨论】:

    • 它在 Views/Web.Config 中其他Html.Label() 方法有效,只是不是这个。
    • 而其他 Html.Label() 实例具有相同的签名?
    • 不,这是唯一的3个参数签名,另一个是2 - 没有object htmlAttributes
    • 您能否将光标单击到视图中的 .Label 方法并按 F12 以查看 Visual Studio 从哪个程序集和命名空间中选择了该重载?这可以帮助您确定要添加到 Web 配置中的命名空间。
    【解决方案4】:

    您收到此异常是因为您尝试使用默认情况下在 ASP.NET MVC3 中不存在的HtmlExtension。您需要将 HTML 属性支持添加到 Html.Label()

    基本上你需要为HtmlHelper添加你自己的扩展方法。您可以从 MVC3 源代码开始。添加这个类:

    public static class MyLabelExtensions
    {
        public static MvcHtmlString Label(this HtmlHelper html, string expression,
            string labelText, object htmlAttributes)
        {
            return Label(html, expression, labelText, 
                            new RouteValueDictionary(htmlAttributes));
        }
    
        public static MvcHtmlString Label(this HtmlHelper html, string expression,
            string labelText, IDictionary<string, object> htmlAttributes)
        {
            return LabelHelper(html,
              ModelMetadata.FromStringExpression(expression, html.ViewData),
              expression, labelText, htmlAttributes);
        }
    
        // added htmlAttributes to the default MVC implementation
        internal static MvcHtmlString LabelHelper(HtmlHelper html,
            ModelMetadata metadata, string htmlFieldName,
            string labelText = null,
            IDictionary<string, object> htmlAttributes = null)
        {
            string str = labelText;
            if (str == null)
            {
                string displayName = metadata.DisplayName;
                if (displayName == null)
                {
                    string propertyName = metadata.PropertyName;
                    if (propertyName == null)
                        str = Enumerable.Last(
                            htmlFieldName.Split(
                                new[]
                                    {
                                        '.'
                            }));
                    else
                        str = propertyName;
                }
                else
                    str = displayName;
            }
            string innerText = str;
            if (string.IsNullOrEmpty(innerText))
                return MvcHtmlString.Empty;
            TagBuilder tagBuilder = new TagBuilder("label");
            tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(
                html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(
                htmlFieldName)));
    
            // this differs from MVC3 source code:
            tagBuilder.MergeAttributes(htmlAttributes);
    
            tagBuilder.SetInnerText(innerText);
    
            // this is different too:
            return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
        }
    }
    

    添加这些扩展方法后,您可以在视图中使用它们,如下所示:

    <%= Html.Label("firstName", "First Name", new { @class = "control-label" }) %>
    

    【讨论】:

      【解决方案5】:

      而不是使用

       <%=Html.Label("firstname","First Name",new {@class="control-label"})%>
      

      尝试使用以下内容:

      剃刀:

         @Html.Label( "firstname", "First Name" ,new {  @class = "control-label" }); 
      

      但是,我个人建议您不要这样做。如果您有一个模型,并且您要从中取名字,那么您可以按如下方式使用它:

         @Html.Label( model=>model.FirstName, "First Name" ,new {  @class = "control-label" }); 
      

      在 ASPX 视图引擎中:

        <%=Html.Label(model=>model.FirstName,"First Name",new {@class="control-label"})%>
      

      请务必在视图页面中添加您当前的模型,如下所示:

         <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Project.Models.Whatever>" %>
      

      【讨论】:

      • 我没有使用 Rzor,@ 代码不适用于 Aspx 渲染引擎。
      • 该页面已经有一个正在使用的模型,因此我不能使用另一个模型。除此之外,我的问题不是如何绑定模型(正确的方法是LabelFor)。这是解决我的错误的方法。
      • @JeremyBoyd:您在给定的屏幕截图中看不到方法的参数吗?显然,他们说要像我一样添加一个表达式......
      • 仔细看参数,是字符串类型的参数。
      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多