此扩展方法不适用于两台独立的开发机器:
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中工作。
确实在VS2010中使用MVC 2 beta。
不在VS2008中使用MVC 1 !!
在两台机器上,我并排安装了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可以找到我的扩展方法,甚至是普通的.NET扩展方法。但是当我的扩展时,在MVC 1中,尝试调用标准扩展,麻烦啤酒!
叹息。
我发现了问题,我想在很多方面Aaronaught哥们你是对的!
我确实在我的Web.Config中有汇编引用,但我错过了一个小细节:
&lt; add assembly =“System.Web.Mvc,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31BF3856AD364E35”/&gt;
真的应该读过:
&lt; add assembly =“System.Web.Mvc,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 31BF3856AD364E35”/&gt;
我没有发现那种邪恶,b * stard 2 。对不起偷看,谢谢你的帮助。因为你是对的,Aaronaught就是你的分数!
答案 0 :(得分:2)
很明显,我的第一个答案与问题无关......但我想知道这是否与配置有关。在web.config
中,您应该在<assemblies>
:
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
我的下一个预感是你可能有错误的版本或根本没有条目,这可能导致它从某个地方获取MVC 2.0版本(也许是GAC)。应用程序可能正在尝试从MVC 2.0调用扩展方法,但是传递了一个针对MVC 1.0编译的HtmlHelper
对象,这将获得无意义的错误消息。
换句话说,也许它发现方法很好但是在错误的程序集中,所以你需要的HtmlHelper
实际上并不是它想要的HtmlHelper
。方法签名看起来相同但不完全相同。
您是否可以检查VS2008中的web.config
和项目参考,并确保System.Web.Mvc
的版本在两者中都相同?