Los métodos de extensión no se pueden enviar dinámicamente


Quiero tener DropDownListFor en MVC

@foreach (var item in Model)
{
    @Html.DropDownListFor(modelItem => item.TitleIds, new SelectList(ViewBag.TitleNames as System.Collections.IEnumerable, "TitleId", "Title.TitleText"), "No: " + ViewBag.MagNo, new { id = "TitleIds" })   
}

En el Controlador

public ActionResult ArticleList(int id)
{
    ArticleWriter_ViewModel viewModel = new ArticleWriter_ViewModel();
    Func<IQueryable<NumberTitle>, IOrderedQueryable<NumberTitle>> orderByFunc = null;
    Expression<Func<NumberTitle, bool>> filterExpr = null;
    if (id > 0)
    {
        filterExpr = p => p.MagazineId.Equals(id);
    }
    var wholeTitles = unitOfWork.NumberTitleRepository.Get(filterExpr,  orderByFunc, "Magazine,Title").ToList();          

    ViewBag.MagNo = wholeTitles[0].Magazine.MagNo.ToString();
    ViewBag.MagId = wholeTitles[0].Magazine.Id;
    ViewBag.TitleNames = wholeTitles;

    return View("../Panel/Magazine/ArticleList", "_BasicLayout", viewModel);
}

Pero me sale este error

'System.Web.Mvc.HtmlHelper<System.Collections.Generic.IEnumerable<Cinemavaadabiat.ViewModel.ArticleWriter_ViewModel>>' no tiene ningún método aplicable llamado " DropDownListFor", pero parece tener un método de extensión con ese nombre. Los métodos de extensión no se pueden enviar dinámicamente. Considere lanzar los argumentos dinámicos o llamar al método extension sin la sintaxis del método extension.

No puedo entender el error, ¿qué debo verificar?

Author: meJustAndrew, 2014-01-05

3 answers

Está utilizando tipos dinámicos en métodos de extensión, lo cual no es compatible.

Convierta los tipos dinámicos en tipos reales, y funcionará.

Por lo que veo ahora, yo diría:

(string) ViewBag.MagNo

Que daría lugar a

@foreach (var item in Model)
{
    @Html.DropDownListFor(modelItem => item.TitleIds, 
       new SelectList(ViewBag.TitleNames as System.Collections.IEnumerable, 
       "TitleId", "Title.TitleText"), 
       "No: " + (string) ViewBag.MagNo, 
       new { id = "TitleIds" })   
}
 171
Author: bas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-05 13:44:52

Mi solución para este problema fue agregar:

    @model MyModel

En la parte superior del control parcial. Lo había olvidado.

 38
Author: mkaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-05 04:19:23

Para ampliar el tema de los métodos de extensión MVC (que es cómo me encontré con esta pregunta), me gusta usar la sintaxis connection.Query() de Dapper que devolverá los resultados como un IEnumerable<dynamic>.

También es posible utilizar objetos dinámicos por:

  • Llamando al método estático directamente, según la respuesta de Jon Skeet :

    @model IEnumerable<dynamic>
    
    @PartialExtensions.Partial(Html, "~/link/to/_partialView.cshtml", Model)
    
  • Envolviéndolo en una clase.

    public class DynamicQueryResult
    {
        public dynamic QueryResults {get; set;}
    }
    

    Luego en tu vista MVC:

    @model Namespace.DynamicQueryResult
    
    @Html.Partial("~/link/to/_partialView.cshtml", Model)
    
 4
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:56