История действий контроллера - PullRequest
0 голосов
/ 05 декабря 2011

В моем приложении интрасети ASP.NET MVC есть хранилище данных, которое использует имя пользователя текущего пользователя Windows для извлечения данных, принадлежащих домашнему сайту пользователя по умолчанию. Логин содержит идентификатор сайта. Класс репозитория является единственным местом, которое обращается к HttpContext.Current.User.Identity и извлекает идентификатор сайта из имени входа. Следовательно, приложение обслуживает данные только одного пользователя. Теперь наши требования изменились: пользователи могут просматривать данные других сайтов, щелкая ссылку на другое имя сайта в меню сайта. Меню сайта находится на главной странице. Когда пользователь нажимает на любую ссылку на сайт, необходимо обновить область сайта, после чего он повторно выполняет действие, которое было выполнено до щелчка по ссылке на сайт с новой областью сайта. Например, если пользователь выполняет список запросов, по умолчанию он будет отображать только запросы с сайта пользователя по умолчанию. Когда пользователь нажимает на другой сайт, он отображает запросы сайта. В приложении много действий контроллера, я предпочитаю не изменять каждое действие каждого контроллера и существующие маршруты. Я думаю о создании нового контроллера с действием для установки области сайта, но я не знаю, как заставить его узнать, какое действие было выполнено до того, как будет выполнено действие нового контроллера. Должен ли я использовать переменную Session для сохранения изменения области? Является ли фильтр действий лучшим способом перефакторинга моего приложения? Любое предложение с примером кода приветствуется. Спасибо.

1 Ответ

0 голосов
/ 08 декабря 2011

Я закончил тем, что создал новый контроллер с действием для создания переменной сеанса, после которой выполняется перенаправление.В репозитории переменная сеанса проверяется, чтобы увидеть, совпадает ли она с домашним сайтом пользователя.Значение переменной сеанса возвращается, если они имеют различную область видимости.Index.aspx для SiteController.Index () возвращает UserControl.

<%@ Control Language="C#"    Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<VETS.Models.Site>>" %>
<ul id="menu">
    <% foreach (var item in Model)
       { %>

    <li><%: Html.ActionLink(item.SiteName, "SetSiteScope", new { siteID = item.SiteID })%></li>
    <%
       } %>
</ul>

public class SiteController : Controller 
{
    public ActionResult SetSiteScope(short siteID)
    {
        HttpContext.Session.Add("CurrentSiteID",siteID);
        //var routeData = ControllerContext.RouteData;
        //routeData.Route.ToString();
        //var actionName = ControllerContext.RouteData.GetRequiredString("action");
        //return RedirectToAction(actionName, "Transfers");
        Uri prevURL = HttpContext.Request.UrlReferrer;
        return Redirect(prevURL.ToString());
    }
}

public class vRepository : IvRepository
{
    public Site CurrentSite()
    {

      if (HttpContext.Current.Session != null && HttpContext.Current.Session["CurrentSiteID"] != null)
      {
        targetSiteID = short.Parse(HttpContext.Current.Session["CurrentSiteID"].ToString());
        targetSite = SiteList().Single(s => s.SiteID == targetSiteID);
      }
      return targetSite;
    }
}
...