2015-03-30 72 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,該頁面被引用並且工作正常。 感謝您的全力幫助