ASP.NET错误:“无法转换类型'对象<> f__AnonymousType1`2”

时间:2011-11-15 14:16:58

标签: asp.net-mvc entity-framework

我对.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 个答案:

答案 0 :(得分:1)

您无法将匿名对象传递给视图。这不起作用,因为匿名类型作为内部发出。由于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>

答案 1 :(得分:0)

正如Darin所说,你不能将匿名类型传递给视图,但你可以convert them to Expando objects,这将阻止你必须定义视图模型。

就我个人而言,我可能只是定义了视图模型,但这个选项很方便。