Ошибка ASP.NET: «Невозможно привести объект типа« <> f__AnonymousType1`2 » - PullRequest
0 голосов
/ 15 ноября 2011

Я очень плохо знаком с .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 %>

<% } %> 

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

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

Вы не можете передавать анонимные объекты в представления.Это не работает, потому что анонимные типы испускаются как внутренние.А поскольку представления 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>
0 голосов
/ 15 ноября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...