gpt4 book ai didi

c# - ASP.NET MVC2 从母版页调用服务方法?

转载 作者:行者123 更新时间:2023-11-30 22:38:41 26 4
gpt4 key购买 nike

在我使用服务 - 存储库模式的 MVC2 应用程序中,如何从母版页调用服务方法?

+--------------------------------------+
| Logo Welcome xyz|
+--------------------------------------+
| Home | Sales | Import | Admin (menu) |
+--------------------------------------+

在我的菜单中,我现在有一些页面按用户角色限制访问。我有一个现有的服务方法可以检查当前用户是否可以查看某个页面:

IPageAccessService.CanAccess(int pageId, int roleId);

在 Controller 方法上,我可以调用它来检查用户是否可以看到该页面:

public ActionResult Update(int id?)
{
if (!_pageAccessService.CanAccess(pageId, roleId))
{
return RedirectToAction("Index", "Home");
}
}

但我不知道如何从我的 Site.Master 调用此方法,以便在创建菜单时如果用户没有访问权限则不会显示菜单项(菜单是一个简单的无序列表):

<li><a href="<%=Url.Content("~/Admin") %>">Admin</a>
<ul>
<li><a href="<%=Url.Content("~/Admin/Roles") %>">User Roles</a></li>
<li><a href="<%=Url.Content("~/Admin/AdminReports") %>">Admin Reports</a></li>
</ul>
</li>

我猜它需要看起来像这样(在添加到列表之前必须检查每个页面):

if (_pageAccessService.CanAccess(pageId, roleId)) <li><a href="<%=Url.Content("~/Admin") %>">Admin</a>
<ul>
if (_pageAccessService.CanAccess(pageId, roleId)) <li><a href="<%=Url.Content("~/Admin/Roles") %>">User Roles</a></li>
if (_pageAccessService.CanAccess(pageId, roleId)) <li><a href="<%=Url.Content("~/Admin/AdminReports") %>">Admin Reports</a></li>
</ul>
</li>

但在我这样做之前,我需要知道如何实际调用 master 的服务方法。

编辑:

我已经改编了 Darin 的答案并得到了这个:

public static class LinkExtensions
{
private static readonly IPageAccessRepository _repo = new PageAccessRepository();
private static readonly IPageAccessService _pageAccess = new PageAccessService(_repo);

public static MvcHtmlString MenuItem(
this HtmlHelper htmlHelper, string linkText,
string url, string pageName
)
{
if (!_pageAccess.CanAccess(pageName))
{
return MvcHtmlString.Empty;
}
// The user can access the page => show the menu
var a = new TagBuilder("a");
a.Attributes["href"] = url;
a.SetInnerText(linkText);
return MvcHtmlString.Create(string.Format("<li>{0}</li>",a));
}

问题是我仍然需要调用该服务,所以我需要能够实例化它。因为它是一个静态类,所以我的 IoC 容器在这里无济于事。所以我仍然必须手动创建服务和存储库。它仍然存在与我最初的丑陋解决方法相同的问题 - 在 View 中手动创建存储库。

最佳答案

您可以编写自定义 HTML 帮助程序来呈现此菜单的不同项目。在基于用户角色的助手内部,您将决定是否生成给定的项目。例如,以下几行:

public static class LinkExtensions
{
public static MvcHtmlString MenuItem(
this HtmlHelper htmlHelper,
string linkText,
string url,
string requiredRole
)
{
var a = new TagBuilder("a");
a.Attributes["href"] = url;
a.SetInnerText(linkText);
if (string.IsNullOrEmpty(requiredRole))
{
// No role required => show the menu item
return MvcHtmlString.Create(a.ToString());
}

var user = htmlHelper.ViewContext.HttpContext.User;
if (!user.IsInRole(requiredRole))
{
// A role is required but no user authenticated or user is not in role
// => show empty
return MvcHtmlString.Empty;
}

// The user is in role => show the menu
return MvcHtmlString.Create(a.ToString());
}
}

在 View 中:

<li>
<%= Html.MenuItem("Admin", Url.Content("~/Admin"), "admin") %>
<ul>
<li>
<%= Html.MenuItem("User Roles", Url.Content("~/Admin/Roles"), "userroles") %>
</li>
<li>
<%= Html.MenuItem("Admin Reports", Url.Content("~/Admin/AdminReports"), "admin") %>
</li>
</ul>
</li>

另一种可能性是使用子操作和 Html.Action helper在主人里面。

关于c# - ASP.NET MVC2 从母版页调用服务方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6005930/

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