Ошибка ASP.NET: невозможно преобразовать объект типа '‹›f__AnonymousType1`2

Я новичок в .NET и Entity Framework, и у меня проблема с моим кодом (ниже). Я получаю следующую ошибку:

        Unable to cast object of type '<>f__AnonymousType1`2[ 
    SamWinInterface.Models.tbl_interface_category,
    SamWinInterface.Models.tbl_interface_menu]' to type
'SamWinInterface.Models.tbl_interface_menu'.

Это мой код:

public ActionResult Index(int id=-1)
{
    ViewBag.Menus = from menu in _db.tbl_interface_menu 
                    join cat in _db.tbl_interface_category on 
                    menu.fld_category_id equals cat.id where 
                    cat.fld_customer_id == id select new { cat, menu }; 

    return View();
}

Я пытаюсь получить меню в зависимости от выбранной категории.

Что-то типа:

<% foreach (tbl_interface_menu m in (IEnumerable)ViewBag.Menus)
   { %>

    <%=  m.fld_section2_title %>

<% } %> 

но я получаю вышеуказанную ошибку. Как я могу получить меню?


person Altin    schedule 15.11.2011    source источник


Ответы (2)


Вы не можете передавать анонимные объекты в представления. Это не работает, потому что анонимные типы испускаются как внутренние. А поскольку представления ASP.NET компилируются в отдельную сборку во время выполнения, они не могут получить доступ к этим временам, поскольку находятся в другой сборке. В основном это означает, что анонимный объект, который вы определили в своем действии контроллера, не может быть доступен в вашем представлении.

Итак, как всегда в приложении ASP.NET MVC, начните с определения представления модели:

public class MyViewModel
{
    public Category Category { get; set; }
    public Menu Menu { get; set; }
}

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

public ActionResult Index(int id=-1)
{
    var model = 
        from menu in _db.tbl_interface_menu 
        join cat in _db.tbl_interface_category 
        on menu.fld_category_id equals cat.id 
        where cat.fld_customer_id == id 
        select new MyViewModel { Category = cat, Menu = menu }; 

    return View(model);
}

и, наконец, иметь строго типизированное представление:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<IEnumerable<AppName.Models.MyViewModel>>" 
%>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<% foreach (var item in Model) { %>
    <%= item.Menu.fld_section2_title %>
<% } %>

</asp:Content>
person Darin Dimitrov    schedule 15.11.2011

Как сказал Дарин, вы не можете передавать анонимные типы в представления, но вы можете преобразовать их в объекты Expando, и это избавит вас от необходимости определять модели представления.

Лично я бы, вероятно, просто определил модели представления, но этот вариант удобен в крайнем случае.

person Brook    schedule 15.11.2011