【发布时间】:2010-02-01 22:44:12
【问题描述】:
此扩展方法不适用于两台单独的开发机器:
public static string DdlTest(this HtmlHelper helper)
{
var si = new List<SelectListItem>();
si.Add(new SelectListItem() { Text = "1", Value = "1" });
si.Add(new SelectListItem() { Text = "2", Value = "2" });
return helper.DropDownList("test", si, new { Class = "Hey" });
}
我收到以下错误:
找不到方法:'System.String System.Web.Mvc.Html.SelectExtensions.DropDownList(System.Web.Mvc.HtmlHelper, System.String, System.Collections.Generic.IEnumerable`1, System.Object)' .
但是,这个内嵌代码确实有效:
<%
var si = new List<SelectListItem>();
si.Add(new SelectListItem() { Text = "1", Value = "1" });
si.Add(new SelectListItem() { Text = "2", Value = "2" });
%>
<%= Html.DropDownList("test", si, new { Class = "Hey" })%>
有人可以验证我没有发疯吗!
请注意:
它确实在 VS2010 和 .NET 4 beta 2 中工作。
它确实在带有 MVC 2 beta 的 VS2010 中工作。
它不在带有 MVC 1 的 VS2008 中工作!!
在两台机器上,我并排安装了 VS2010 beta 2 和 VS2008。
我在这里做错了吗?
编辑:
现在我已经通过反汇编 SelectExtensions 类并自己实现它来解决这个问题,这很有效。有趣的是,在反汇编代码中有一个模棱两可的方法调用错误。虽然不确定这是否只是反射的结果。
编辑 2:
为了使示例更清晰,假设这个 ASPX:
<%
var si = new List<SelectListItem>();
si.Add(new SelectListItem() { Text = "1", Value = "1" });
si.Add(new SelectListItem() { Text = "2", Value = "2" });
%>
<%= Html.DropDownList("test", si, new { Class = "Hey" })%>
<%= Html.TextBox("testing")%>
<%= Html.DdlTest1("test", si, new { Class = "Hey" })%>
<%= Html.DdlTest2("test", si, new { Class = "Hey" })%>
<%= Html.Test3()%>
这在我的扩展方法类中:
using System.Web.Mvc;
using System.Web.Mvc.Html;
...
public static string DdlTest1(this HtmlHelper helper, string name,
IEnumerable<SelectListItem> items, object htmlAttributes)
{
return "Whatever";
}
public static string DdlTest2(this HtmlHelper helper, string name,
IEnumerable<SelectListItem> items, object htmlAttributes)
{
return helper.DropDownList(name, items, htmlAttributes);
}
public static string Test3(this HtmlHelper helper)
{
return helper.TextBox("testing");
}
<%= Html.DropDownList("test", si, new { Class = "Hey" })%> 可以工作<%= Html.TextBox("testBox")%> 可以工作
<%= Html.DdlTest1() %> 将起作用<%= Html.DdlTest2() %> 将给出以下错误:
找不到方法:'System.String System.Web.Mvc.Html.SelectExtensions.DropDownList(System.Web.Mvc.HtmlHelper, System.String, System.Collections.Generic.IEnumerable`1, System.Object)' .
<%= Html.DdlTest3() %> 会报如下错误:
找不到方法:'System.String System.Web.Mvc.Html.InputExtensions.TextBox(System.Web.Mvc.HtmlHelper, System.String)'。
因此我们可以得出结论,ASPX 可以找到 my 扩展方法,甚至是普通的 .NET 方法。但是当 my 扩展时,在 MVC 1 中,尝试调用标准扩展时,麻烦就来了!
编辑 3:
叹息。
我发现了问题所在,我想在很多方面 Aaronaught 哥们你是对的!
我确实在我的 Web.Config 中有程序集引用,但我错过了一个小细节:
确实应该是这样写的:
我没有发现那个邪恶的,b*stard 2。我很抱歉窥视,感谢您的所有帮助。积分归你 Aaronaught,毕竟你是对的!
【问题讨论】:
-
你是
using System.Web.Mvc.Html;吗? -
@Joel - 好电话,是的,我是。我还确保在我的 Web.Config 命名空间中包含 System.Web.Mvc.Html
-
实际上,我只是想在已经发布我的答案之后再问这个问题……您是在 runtime 还是 compile-time 收到此错误?
-
@josh:只是想我会确定的。 ;)
-
我有点担心匿名类中未引用的
Class成员。你试过用@class代替Class吗?
标签: asp.net-mvc drop-down-menu extension-methods