ASP.NET MVC 5布局有部分View的麻烦

时间:2015-03-30 23:51:32

标签: html asp.net asp.net-mvc-5

我是来自网络形式世界(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}}

3 个答案:

答案 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并且它工作正常。 谢谢你的帮助