我是来自网络形式世界(3天大:)的MVC世界的新手。我创建了一个MVC网站,其中包含来自数据库的动态加载菜单,并根据点击的内容加载相关页面。到目前为止,我在单独的页面上加载菜单视图,其索引操作返回一个视图(菜单项列表)和点击每个子菜单项调用相关页面.. 我创建了一个新的布局页面,用于加载菜单项(从menuView复制代码)
这里是_Menu
@model IEnumerable<MedicareQA_MVC.Models.spS_MenuItems_Result>
<div >
<ul class="nav nav-tabs nav-stacked col-sm-3 " >
@{
var mainElmnt = Model.Select(o=>o.MenuElementName).Distinct();
foreach (var mainNode in mainElmnt)
{
var elmnts = Model.Where(p => p.MenuElementName == mainNode);
<li >@mainNode</li>
if( elmnts.Count() >0)
{
foreach (var elmt in elmnts)
{
<ul class="nav nav-tabs nav-stacked ">
<li>@Html.ActionLink(elmt.Element,"QADetails","Home",new {id =elmt.RecID },null) </li>
</ul>
}
}
}
}
</ul>
</div>
页面加载正确,但点击菜单项我得到以下
传递到字典中的模型项是类型的 &#39; System.Collections.Generic.List
菜单控制器
public ActionResult Index()
{
MenuModel menu = new MenuModel();
return View(menu.GetMenu1());
}
_Layout
@model IEnumerable<MedicareQA_MVC.Models.spS_MenuItems_Result>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title - My ASP.NET MVC Application</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width" />
@Styles.Render("~/Content/Bootstrap")
@Scripts.Render("~/bundles/modernizr")
<link href="~/Content/bootstrap.css" rel="stylesheet" />
</head>
<body>
<table>
<tr class="navbar navbar-fixed-top">
<td class="span12" colspan="2"> <h1>Welcome to our Website</h1></td>
</tr>
<tr >
<td class="span4 nav nav-stacked " style="vertical-align:top" >
@Html.Partial("_Menus",Model)
</td>
<td class="span7">
@RenderSection("featured", required: false)
@RenderBody()
</td>
</tr>
</table
页面加载菜单很好。但是,如果单击菜单,我会收到此运行时错误
传递到字典中的模型项是类型的 &#39; {System.Collections.Generic.List {1}}
答案 0 :(得分:0)
return View(menu.GetMenu1());
返回一个项目列表,而在视图中你使用了IEnumerable,即可枚举为模型。
将顶部视图更改为
@model List<MedicareQA_MVC.Models.spS_MenuItems_Result>
答案 1 :(得分:0)
视图接受Ienumerable,这应该与List的工作方式相同。 此外,我确实根据dotnetcurry找到了临时工作解决方案,我做了以下工作。 在_layout中创建一个div容器 并调用ajax功能
<script type="text/javascript">
if ($("#menuContainer")[0].innerHTML == "") {
$.ajax({
url: "@Url.Content("~/Menu/MenuLoader")",
type: "GET",
cache:true,
success: function (response) {
var container = $("#menuContainer");
container.html(response);
},
error: function () {
alert("nothing");
}
});
}
</script>
菜单控制器具有以下内容
的[AcceptVerbs(HttpVerbs.Get)] public ActionResult MenuLoader() { MenuModel menu = new MenuModel();
return PartialView("_Menus", menu.GetMenu1()); }
不幸的是,页面加载后菜单会加载。希望有<asp:scripthandler>
我可以在这里使用的那种功能......
感谢您的支持
答案 2 :(得分:0)
是的,这是一个糟糕的解决方案......我终于明白了。因为我没有代码,我只能解释。 所以我遇到的问题是我在_MainLayout页面上声明了Model。因此,菜单第一次正确加载,因为控制器具有相应的Action控件。但是,当我点击一个菜单项时,它会加载另一个页面和另一个控制器,当然这个控制器没有正确的模型,因此运行时错误。 解决方法。 我从_MainLayout中删除了Model,并在_MainLayout中调用了@ html.Action(“ActionNameToLoadMenu”)。相应的ActionMethod将返回动态菜单的部分视图。我在其他控制器中为正在引用的页面重复了ActionMethod并且它工作正常。 谢谢你的帮助