【问题标题】:Why can I not call the DropDownList extensions methods from another extension method?为什么我不能从另一个扩展方法调用 DropDownList 扩展方法?
【发布时间】: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");
}

&lt;%= Html.DropDownList("test", si, new { Class = "Hey" })%&gt; 可以工作
&lt;%= Html.TextBox("testBox")%&gt; 可以工作 &lt;%= Html.DdlTest1() %&gt; 将起作用
&lt;%= Html.DdlTest2() %&gt; 将给出以下错误:

找不到方法:'System.String System.Web.Mvc.Html.SelectExtensions.DropDownList(System.Web.Mvc.HtmlHelper, System.String, System.Collections.Generic.IEnumerable`1, System.Object)' .

&lt;%= Html.DdlTest3() %&gt; 会报如下错误:

找不到方法:'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


【解决方案1】:

很明显,我的第一个答案与问题无关......但我想知道它是否与其他配置相关。在您的web.config 中,您的&lt;assemblies&gt; 中应该有这个:

<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral,
     PublicKeyToken=31BF3856AD364E35"/>

我的下一个预感是您可能有错误的版本或根本没有条目,这可能导致它从某个地方(可能是 GAC)获取 MVC 2.0 版本。应用程序可能正在尝试从 MVC 2.0 调用扩展方法,但传递给它一个针对 MVC 1.0 编译的 HtmlHelper 对象,这会给您带来无意义的错误消息。

换句话说,也许它找到了很好的方法,但是在错误的程序集中,所以你需要的 HtmlHelper 实际上与它想要的 HtmlHelper 不同。方法签名看起来相同,但并不完全相同。

您能否在 VS2008 中同时检查您的 web.config 和项目引用,并确保两者的 System.Web.Mvc 版本相同?

【讨论】:

  • 你有点混淆了这两者 - 正如错误所暗示的那样(呵呵)它是原始的 DropDownList 扩展方法,它很难找到。无论如何,所有正确的程序集和命名空间都在 Web.Config 中(对于我的扩展)。我自己工作的其他扩展方法非常好:(
  • @josh:后来我注意到了,但这有点令人困惑,因为您没有指定在什么时候收到此错误(请参阅我对原始问题的评论)。我绝对可以在 VS 2008,MVC 1 中编写它,并且它可以编译和运行。
  • 很公平,我的问题令人困惑!我已经编辑了我的问题(请参阅:Edit 2),概述了一个简单的例子,说明它的短裤采用了正确的旧式扭曲。很高兴您确认它有效,谢谢。
猜你喜欢
  • 2011-12-09
  • 2015-03-09
  • 2014-02-23
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多