我对.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 %>
<% } %>
但我收到了上述错误。我怎样才能获得菜单?
答案 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,这将阻止你必须定义视图模型。
就我个人而言,我可能只是定义了视图模型,但这个选项很方便。