方法'Label'没有重载需要3个参数

时间:2012-12-14 16:54:53

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

我正在使用ASP.Net MVC 3,已经引用了所有正确的DLL(参见附带的屏幕截图),但由于某种原因,我得到了这个编译错误。

Method Signature

Web.config Assemblies

Compilation Error

5 个答案:

答案 0 :(得分:7)

这是一个奇怪的事情。我能够重现你的错误。我还能够弄清楚它为什么会发生以及如何绕过它。

为什么会发生

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(); %>

确保它没有嵌套在剃须刀或<%=块内,因为它会阻止它可用。它需要处于页面的全局级别。

使用正确的标签

现在你可以使用它:

剃刀

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

ASP

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

答案 1 :(得分:1)

在我看来,你从 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 ......

答案 2 :(得分:0)

查看您的~/Views/Web.config

查看是否有configuration/system.web/pages/namespaces节点

尝试在其中添加<add namespace="System.Web.Mvc.Html"/>

Label方法位于上述命名空间中。看起来你的观点找不到它。

由于您没有编译视图,因此构建得很好。此外,您的intellisense正在从引用中获得该方法。但是,这几乎就像你的视图没有在运行时获取方法。

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

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

答案 3 :(得分:0)

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

基本上您需要为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" }) %>

答案 4 :(得分:-1)

而不是使用

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

尝试使用以下内容:

IN RAZOR:

   @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>" %>