gpt4 book ai didi

c# - 从 MVC 共享 View 从数据库获取数据

转载 作者:行者123 更新时间:2023-12-02 04:51:41 25 4
gpt4 key购买 nike

我有一个共享的 _Layout.cshtml,我在其中调用以下 @Html.Partial("TopMenu");
TopMenu.cshtml 中,我有一个网站顶部菜单的标记。

<ul class="menu">
<li class="menu-item"><a href="#">menu item 1</a></li>
<li class="menu-item"><a href="#">menu item 2</a></li>
<li class="menu-item"><a href="#">menu item 3</a></li>
<li class="menu-item"><a href="#">menu item 4</a></li>
</ul>

我想从数据库绑定(bind)那个菜单。我是 MVC 的新手。我应该为该 View 创建 Controller 吗?

这个菜单应该出现在我的所有页面中。给我一个想法,它是如何在 mvc 中实现的。我来自 asp.net 网络表单国家。

功能

public IEnumerable<Category> GetCategories(Guid? id)
{
return context.Categories.Where(c => c.CategoryID == id || !id.HasValue).ToList();
}

更新

public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}


public PartialViewResult TopMenu()
{
using (var ctx = new eventzEntities())
{
CategoryManager catMan = new CategoryManager(ctx);
var listOfCat = catMan.GetCategories(null);

return PartialView(listOfCat);
}
}
}

@Html.Action("TopMenu","Home")
<div class="secondary-navigation">
<nav id="navigation">
<ul id="menu-main-navigation" class="menu sf-js-enabled">
@foreach (var cat in Model)
{
<li class="menu-item menu-item-type-taxonomy menu-item-object-category ">
<a href="#">@cat.CategoryName</a>
</li>
}

...

最佳答案

因为您所有的 View /页面都需要这个,所以我建议您创建一个基本 Controller ,它将从数据库中获取菜单结构,然后将其提供给您所有的继承 Controller 。因此,例如,您将像这样制作一个基本 Controller :

public class BaseController : Controller
{
public MenuModel Menu { get; set; }

protected override void Initialize(RequestContext requestContext)
{
// This get's your menu structure from the database via some service layer you need to create yourself.
// Keep in mind that this call will happen on every postback so if performance is an issue you might want to cache the menu in some way, maybe per user.
Menu = _menuServiceLogic.GetMenuItems();
ViewBag.Menu = Menu;
}

一旦你有了这个,那么所有生成包含菜单的 View 的 Controller 都需要从这个基本 Controller 继承:

 public class HomeController : BaseController
{
// Controller logic in here...
}

所以现在您可以访问所有 Controller 上的菜单,所以剩下的就是以某种好的方式将它传递给 View 。我建议您研究如何制作自定义 Razor View 类。 Phil Haacked 有一篇关于此主题的精彩文章:

http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx

但简而言之,默认情况下每个 Razor View 都继承自 System.Web.Mvc.WebViewPage。我们将用我们自己的实现替换那个类:

namespace YourApp.Website.Views
{
public abstract class CustomWebViewPage : WebViewPage
{
private MenuModel _menu;

public MenuModel Menu
{
get
{
try
{
_menu = (MenuModel)ViewBag.Menu;
}
catch (Exception)
{
_menu = null;
}
return _menu;
}
}
}

public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel> where TModel : class
{
private MenuModel _menu;

public MenuModel Menu
{
get
{
try
{
_menu = (MenuModel)ViewBag.Menu;
}
catch (Exception)
{
_menu = null;
}
return _menu;
}
}
}
}

现在您需要做的就是修改 web.config 中的这一行:

<pages pageBaseType="System.Web.Mvc.WebViewPage">

为此:

<pages pageBaseType="YourApp.Website.Views.CustomWebViewPage">

现在您可以在您的 View 中执行以下操作以引用您的菜单:

@Menu

Menu 变量是强类型的(在我的示例中它是 MenuModel 类型),您可以在从基本 Controller 继承的每个 Controller 操作/ View 上访问菜单的所有属性。

关于c# - 从 MVC 共享 View 从数据库获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18726053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com