2015-03-30 60 views
0

我是一个来自web表单世界(3天:)的MVC世界的新手)。我创建了一个MVC网站,其中包含一个来自数据库的动态加载的菜单,并根据点击的内容加载关联的页面。到目前为止,我在单独的页面上加载菜单视图,其索引操作返回一个视图(菜单项列表)和单击每个子菜单项的调用相关网页.. 我创建了加载菜单项新的布局页面(复制从menuView代码)ASP.NET MVC 5布局麻烦部分查看

这里的_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> 

该页面加载正确的,但是,点击菜单项我得到以下

传递到字典的模型产品 类型的“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 

页面加载罚款与菜单。但在点击菜单的事件中,我得到这个运行时错误

传递到字典的模型产品 类型的“System.Collections.Generic.List 1[MedicareQA_MVC.Models.QuestionAnswer]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable

+1

显示完整的错误信息和一些代码。你的视图有'@model someType',但是你没有将'typeType'传递给视图,你传递了其他东西,但没有看到任何代码,它不可能告诉 – 2015-03-30 23:55:57

+0

我怀疑你的_menulayout视图中你的模型是一个列表(例如@模式列表<...>)。尝试删除该行,看看错误是否消失。 – 2015-03-31 00:36:38

+0

谢谢你们......不幸的是,我没有与我的代码..我会做到这一点,一旦我在工作电脑... – Dom 2015-03-31 01:59:22

回答

0
return View(menu.GetMenu1()); 

正在恢复项目的列表,而在视图中你已经使用了IEnumerable,即enumerable作为模型。来看

更改顶线

@model List<MedicareQA_MVC.Models.spS_MenuItems_Result> 
+0

该视图接受Ienumerable,这应该以同样的方式 – Dom 2015-03-31 14:59:13

+0

要点是,您从视图中定义的控制器和模型传递的内容必须匹配。您可以显示GetMenu1()函数。它必须返回列表<> – 2015-03-31 15:06:47

+0

我改变了控制器通过一个IEnumerable 公共IEnumerable的使用getMenu(){ 名单 结果 =新名单(); mh = new MenuHandler(); return menuList; } – Dom 2015-03-31 18:58:29

0

的观点接受IEnumerable和本应工作方式相同的列表。 此外,我确实找到了一个临时工作解决方案,按照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)] 公共的ActionResult MenuLoader() { MenuModel menu = new MenuModel();

 return PartialView("_Menus", menu.GetMenu1()); 
    } 

不幸的是,页面加载后的菜单负载。希望有<asp:scripthandler> 样的功能也有所我可以使用的地方在这里的....

感谢支持

+0

这是一个可怕的解决方案。你需要一个方法(比如说)'Menu()',用'[ChildActionOnly]'属性来装饰,返回你的菜单,然后在布局中删除'@model IEnumerable '(布局不应该有一个模型定义,除非是基本视图模型)并使用'@ Html.Action(“Menu”。“YourController”)'(不是'@ Html.Partial') – 2015-03-31 23:41:15

0

是的,这是一个可怕的解决方案伙计......我终于想通了。由于我没有与我的代码,我只能解释。 所以我遇到的问题是我在_MainLayout页面声明了模型。所以菜单第一次正确加载,因为控制器有相应的Action控件。但是当我点击一个菜单项时,它会加载另一个页面和另一个当然没有正确模型的控制器,从而导致运行时错误。 工作。 我从_MainLayout中移除了模型,并在_MainLayout中调用了@ html.Action(“ActionNameToLoadMenu”)。相应的ActionMethod将返回动态菜单的部分视图。我在其他控制器中重复了ActionMethod,该页面被引用并且工作正常。 感谢您的全力帮助