簡體   English   中英

從ASP.NET MVC中的布局調用操作方法

[英]Call an action method from layout in ASP.NET MVC

我有一個布局和一個局部視圖,它們在共享文件夾中。 部分視圖顯示非靜態的頂級菜單項。 所以我需要調用一個action方法來從數據庫中獲取菜單項。 為此,我創建了一個控制器並在其中添加了一個動作方法。

當我嘗試在Web瀏覽器中瀏覽頁面時,發生此錯誤:

未找到路徑'/'的控制器或未實現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(在Controllers文件夾中):

 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);
        }    
    }

如果你把它放在你的視野中會發生什么?

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

(並注意這一切,直到一切正常:// [ChildActionOnly])

改變這一行,

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

至,

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

並檢查。

存在不同的方式,對於這種情況我喜歡在布局中使用html.action,並且在控件中我將創建一個字符串Menu,該字符串包含我需要的html代碼,控制器結束時返回Content(菜單);

例如

布局:

<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恢復數據並使用把手或其他模板代碼

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

您可以在此頁面上檢查正確的方法重載

另外:如果在Html.Action方法中指定控制器(例如,您可以使用方法的變體),則不需要編寫后綴“Controller”,即使這是您的類名。 因此,不要使用字符串“LayoutController”,而只需編寫“Layout”。

此時,框架是基於約定的。

我就是這樣做的:

布局

@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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM