我正在使用ASP.Net MVC 3,已经引用了所有正确的DLL(参见附带的屏幕截图),但由于某种原因,我得到了这个编译错误。
答案 0 :(得分: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" }) %>
答案 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>" %>