我正在使用 ASP.Net MVC 3,已经引用了所有正确的 DLL(请参阅包含的屏幕截图),但由于某种原因,我得到了这个编译错误。
5 回答
这是一个奇怪的事件。我能够重现您的错误。我还能够弄清楚它发生的原因以及如何绕过它。
为什么会发生
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" }) %>
在我看来,您从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 ......
看看你的~/Views/Web.config
看看有没有configuration/system.web/pages/namespaces
节点
尝试<add namespace="System.Web.Mvc.Html"/>
在那里添加。
Label 方法位于上述命名空间中。看起来你的视图没有找到它。
由于您不编译视图,因此它构建得很好。此外,您的智能感知从参考资料中得到了很好的方法。但是,这几乎就像您的视图在运行时没有获取该方法一样。
虽然将上述命名空间添加到 web.config 中可能会解决问题,但它会在您的应用程序中隐藏一个潜在的更大问题。“修复”应该为您提供进一步调试情况的起点。
如果这解决了您的问题,请尝试将您的 web.config 文件与一个全新且未受影响的 MVC 项目进行比较。看看你有什么不同,这可能会阻止视图找到 Html Helper。
你得到这个异常是因为你试图使用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" }) %>
而不是使用
<%=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>" %>