2014-10-29 62 views
4

我有一個佈局和一個局部視圖,它們位於共享文件夾中。部分視圖顯示不是靜態的頂層菜單項。所以我需要調用一個操作方法從數據庫獲取菜單項。爲此,我創建了一個控制器並在其中添加一個操作方法。從ASP.NET MVC中的佈局調用操作方法

當我嘗試瀏覽網頁瀏覽器的頁面,這個錯誤發生:

的路徑控制器「/」沒有被發現,或者不執行一個IController。

注: 我試過Html.RenderAction,Html.Partial方法太... 我試圖創建另一個視圖文件夾,並創建一個以「文件夾名稱命名的新的局部視圖和新的控制器+控制器「後綴。

佈局:

<!DOCTYPE html> 
<html> 
<head> 
    <title>@ViewBag.Title</title> 
</head> 
<body> 
    <div id="header"> 
     @Html.Action("~/Views/Shared/_TopMenu.cshtml", "LayoutController", new {area =""}); //Here is the problem. 

    </div> 
    <div> 
     @RenderBody(); 
    </div> 

</body> 
</html> 

_TopMenu.cshtml:

@model IList<string> 

@foreach (string item in Model) 
{ 
    <span>item</span> 
} 

LayoutController(在控制器文件夾):

public class LayoutController : Controller 
    { 
     // 
     // GET: /Shared/ 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [ChildActionOnly] 
     [ActionName("_TopMenu")] 
     public ActionResult TopMenu() 
     { 
      IList<string> menuModel = GetFromDb(); 
      return PartialView("_TopMenu", menuModel); 
     }  
    } 

回答

5

如果你把它放在你的視圖中會發生什麼?

@{ Html.RenderAction("TopMenu", "Layout"); } 

(兼評了這一點,直到一切正常:// [ChildActionOnly])

+0

錯的是隻使用一個控制器參數的方法?我記得我用'RenderAction'也使用了'Layout'。但它沒有奏效。也許我必須睡覺。謝謝! – 2014-10-29 13:37:00

+0

我不能放鬆。我嘗試了很多解決方案建議。喜歡你的答案。爲什麼它沒有奏效?你知道理由嗎? – 2014-10-29 13:38:11

0

您正在使用Action-Method的錯誤超載。變體中的第二個參數不是控制器名稱,而是操作名稱。

您可以檢查此page

也是一個正確的方法重載:如果您指定的Html.Action方法控制器(可以例如根據該方法的this變化做),你不需要寫後綴「控制器」,即使這是你的Classname。因此,您不必使用字符串「LayoutController」,而只需編寫「Layout」。

此時框架是基於約定的。

+0

不要擔心寫答案,而不是評論。你只是想幫助我。羅賓遜的回答被羅賓遜刪除。因爲他的回答是由paramater計數錯誤的。 – 2014-10-29 13:44:28

3

改變這一行,

@Html.Action("~/Views/Shared/_TopMenu.cshtml", "LayoutController", new {area =""}); 

到,

@Html.Action("_TopMenu", "Layout", new {area =""}); 

和檢查。

+0

我無法相信它!錯誤的東西只是一個控制器參數的使用方式。也謝謝你。 – 2014-10-29 13:41:13

1

存在不同的方式,對於這種情況我喜歡使用html。在佈局行動,並在控制我將創建一個字符串,菜單,字符串中包含的HTML代碼,我需要,以回報內容(菜單)控制器端;

例如

佈局:

<body> 
    <nav> 
     @Html.Action("_TopMenu", "Layout") 
    </nav> 

控制器

public class LayoutController : Controller 
    { 
     public ActionResult _TopMenu() 
     { 
      IList<string> menuModel = GetFromDb(); 
      string menu = "<ul>"; 
      foreach(string x in menuModel) 
      { 
       menu +="<li><a href='"+x+"'>+x+"</a></li>"; 
      } 
      menu+="</ul>"; 
      return Content(menu); 
     } 
    } 

我很喜歡,因爲我可以使用多種選項來創建菜單dinamics更多的複合物。

其它方式使用AJAX來回收代碼

+0

我以前沒聽過把手。它看起來很有用。我會玩弄它。感謝不同的方式和工具建議。 – 2014-10-29 17:38:49

+0

UPS我嘗試寫車把http://handlebarsjs.com/ – Pablote 2014-10-30 16:06:01

+0

都能跟得上。我已經找到了作爲把手:)再次感謝你。 – 2014-10-31 07:40:05

0

的數據,並使用把手或其他模板這是我做的:

佈局

@Html.Action("GetAdminMenu", "AdminMenu") 

管理菜單控制器

public PartialViewResult GetAdminMenu() 
{ 
    var model = new AdminMenuViewModel(); 

    return PartialView(model); 
} 

GetAdminMenu.cshtml

@model ReportingPortal.Models.AdminMenuViewModel 


<div class="form-group"> 
    <label class="col-md-4 control-label" for="selectbasic">School Name</label> 
    <div class="col-md-8"> 
     @Html.DropDownListFor(model => model.SelectedID, new SelectList(Model.DataList, "Value", "Text", Model.SelectedID), "", new { @class = "form-control", @required = "*" }) 
    </div> 
</div>