2014-10-29 64 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>