Как в моем приложении MVC2, использующем шаблон Service - Repository, как я могу вызвать метод сервиса с главной страницы?
+--------------------------------------+
| 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>
Но прежде чем я смогу это сделать, мне нужно знать, как на самом деле вызвать метод обслуживания у мастера.
EDIT:
Я адаптировал ответ Дарина и получил:
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 здесь не поможет. Поэтому мне все еще нужно вручную создать службу и репозиторий. И проблема все та же, что и у моего первоначального уродливого обходного пути - создание хранилища вручную в представлении.