Почему я не могу вызвать методы расширений DropDownList из другого метода расширения?

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

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.

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

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

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

Изменить 3:

Вздох.

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

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

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

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

1 ответ

Решение

Ясно, что мой первый ответ не был связан с проблемой... но мне интересно, не связано ли это с конфигурацией. В вашем 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 то же самое в обоих?

Другие вопросы по тегам