【发布时间】:2011-05-15 01:34:15
【问题描述】:
在使用 Service - Repository 模式的 MVC2 应用程序中,如何从母版页调用服务方法?
+--------------------------------------+
| Logo Welcome xyz|
+--------------------------------------+
| Home | Sales | Import | Admin (menu) |
+--------------------------------------+
在我的菜单中,我现在有一些受用户角色限制访问的页面。我有一个现有的服务方法可以检查当前用户是否可以查看某个页面:
IPageAccessService.CanAccess(int pageId, int roleId);
在控制器方法上,我可以调用它来检查用户是否可以看到页面:
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>
但在我能做到这一点之前,我需要知道如何真正从主服务器调用服务方法。
编辑:
我已经改编了达林的答案,并得到了这个:
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 容器在这里无济于事。所以我仍然必须手动创建服务和存储库。而且它仍然遇到与我原来的丑陋解决方法相同的问题 - 在视图中手动创建存储库。
【问题讨论】:
标签: c# web-services asp.net-mvc-2 master-pages