4

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

方法签名

Web.config 程序集

编译错误

4

5 回答 5

7

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

为什么会发生

System.Web.Mvc.Html和之间存在命名空间冲突System.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" }) %>

于 2012-12-20T21:29:43.450 回答
1

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

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

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

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

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

于 2012-12-19T10:19:20.037 回答
0

看看你的~/Views/Web.config

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

尝试<add namespace="System.Web.Mvc.Html"/>在那里添加。

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

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

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

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

于 2012-12-18T18:19:43.593 回答
0

你得到这个异常是因为你试图使用HtmlExtension默认情况下在 ASP.NET MVC3 中不存在的。您需要将 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" }) %>
于 2012-12-19T20:37:25.067 回答
-1

而不是使用

 <%=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>" %>
于 2012-12-14T17:13:33.170 回答