Почему я не могу вызвать методы расширений DropDownList из другого метода расширения? - PullRequest
2 голосов
/ 02 февраля 2010

Этот метод расширения не работает на двух отдельных машинах разработки:

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.

Это не не работает в VS2008 с MVC 1 !!

На на обеих машинах параллельно установлены VS2010 beta 2 и VS2008.

Я что-то здесь не так делаю?

Edit:

Пока что я взломал это, разобрав класс 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. Но когда my extensions, в MVC 1, попробуйте вызвать стандартные расширения, проблема варит!

Редактировать 3:

Вздох.

Я нашел проблему, и я полагаю, во многих отношениях, приятель Аарона, ты был прав!

У меня есть ссылка на сборку в моем Web.Config, но я пропустил одну крошечную деталь:

Это действительно должно было быть прочитано:

Я не заметил этого зла, б * стар 2 там. Простите, спасибо за вашу помощь. Очки идут к тебе, Аарон, как ты и был прав!

1 Ответ

2 голосов
/ 02 февраля 2010

Очевидно, что мой первый ответ не был связан с проблемой ... но мне интересно, связан ли он с конфигурацией. В вашем web.config это должно быть в вашем <assemblies>:

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

Моя следующая догадка - у вас может быть либо неправильная версия, либо вообще нет записи, что может привести к тому, что она откуда-то заберет версию MVC 2.0 (возможно, GAC). Приложение может пытаться вызвать метод расширения из MVC 2.0, но передать ему объект HtmlHelper, скомпилированный с MVC 1.0, что приведет к появлению этого бессмысленного сообщения об ошибке.

Другими словами, возможно, он нашел метод просто отличным, но в неправильной сборке, поэтому нужный вам HtmlHelper на самом деле не тот же HtmlHelper, который ему нужен. Сигнатуры метода выглядят идентичными, но не совсем идентичными.

Можете ли вы проверить и свои web.config, и ваши Проектные ссылки в VS2008 и убедиться, что версия System.Web.Mvc одинакова в обоих?

...