MVC下,利用XML建立自己的菜单,用RenderPartial方法

发布于 2022-09-08 05:21:47 字数 4712 浏览 13 评论 0

我们利用XML来建立自己的菜单,因为如果采用角色会有不同的权限菜单,我们忽略读取权限,利用一个XML文件来实现动态菜单。1.建立菜单数据类文件
点击Models->add->New Item…

新建一个Menu.cs类文件using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MVCMembership.Models
{
public class Menu
{
/// <summary>/// 标题/// </summary>public string Title
{
get;
set;
}
/// <summary>/// Action/// </summary>public string Action
{
get;
set;
}
/// <summary>/// Controller/// </summary>public string Controller
{
get;
set;
}
public Menu()
{
}
public Menu(string strTitle, string strAction, string strController)
{
Title = strTitle;
Action = strAction;
Controller = strController;
}
}
}2.建立Menu.XML
在models目录下简历如下menu.xml文件<?xml version="1.0" encoding="utf-8" ?><Menu><MenuItem Order="1" Action="Index" Controller="Home">Home</MenuItem><MenuItem Order="2" Action="About" Controller="Home">About</MenuItem><MenuItem Order="3" Action="New" Controller="XML">XML</MenuItem></Menu>其中order为顺序,Action和Controller为对应点击menu转到的action3.建立自定义控件来显示menu
我们在ViewsShared下面Add-view

选中Create a partial view(.ascx)和Create a strongly-typed view复选框,
并选择view data class为MVCMembership.Models.Menu
注意下面的步骤
把<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MVCMembership.Models.Menu>" %>

改为<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<MVCMembership.Models.Menu>>" %>这样我们实现了IEnumerable接口,可以foreach了具体文件代码如下<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<MVCMembership.Models.Menu>>" %>
<%@ OutputCache Duration="10000" VaryByParam="none" %>
<ul id="menu">
<% foreach(var menu in Model)
{ %>
<li>
<%= Html.ActionLink(menu.Title,menu.Action,menu.Controller)%>
</li>
<% } %>
</ul>看到没有,我们用了foreach输出了菜单列表4.最后我们修改site.master把menu加进去
我们先添加一个函数 <script runat="server" type="text/C#">
public MVCMembership.Models.Menu[] GetMenu()
{
List <MVCMembership.Models.Menu> menus=new List<MVCMembership.Models.Menu>();
if (Session["Menu"] == null)
{
XElement menuElement = XElement.Load(Server.MapPath(Url.Content("~/Models/Menu.xml")));
var m = from p in menuElement.Elements("MenuItem")
orderby p.Attribute("Order").Value
select p;
foreach (var mm in m)
{
MVCMembership.Models.Menu menu = new MVCMembership.Models.Menu();
menu.Title = mm.Value.Trim();
menu.Controller = mm.Attribute("Controller").Value.Trim();
menu.Action = mm.Attribute("Action").Value.Trim();
menus.Add(menu);
}
Session["Menu"] = menus.ToArray();
return (MVCMembership.Models.Menu[])Session["Menu"];
}
elsereturn (MVCMembership.Models.Menu[])Session["Menu"];
}
</script>这里用Session[“Menu"]来保存菜单,当然你可以更据你的角色来分配菜单,当然你可以更据你的角色来分配菜单,也可以不用session,随你了在原来menu的地方添上如下代码   <%Html.RenderPartial("~/Views/Shared/Menu.ascx",
(MVCMembership.Models.Menu [])GetMenu());%>  我们利用RenderPartial()方法来ajax输出菜单实现部分刷新,注意RenderPartial()方法可以只写控件名称,但我们这里给出了全路径来避免搜索的时间,提高一点速度好了,我们来看看最终效果是不是和原来一样?但我们这是动态的,可以根据要求动态改变的,好了,就说到这里吧

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文