控制器动作历史

时间:2011-12-05 07:00:39

标签: model-view-controller session controller action

我的ASP.NET MVC内部网应用程序有一个数据存储库,它使用当前用户的Windows登录来检索属于用户默认主页的数据。登录包含站点标识符。存储库类是访问HttpContext.Current.User.Identity并从登录中提取站点ID的唯一位置。因此,应用程序仅提供一个用户站点的数据。现在,我们的要求已更改,用户可以通过单击“站点”菜单中的其他站点名称链接来查看其他站点的数据。 “站点”菜单位于“主站”页面中。当用户单击任何站点链接时,需要更新站点范围,然后重新执行在使用新站点范围单击站点链接之前执行的操作。例如,如果用户执行“请求列表”,则默认情况下它将仅显示来自用户默认站点的请求。当用户点击另一个站点时,它将显示站点的请求。应用程序中有许多控制器操作,我不想修改每个控制器和现有路径的每个操作。我正在考虑创建一个具有设置站点范围的操作的新控制器,但我不知道如何让它知道在执行新控制器操作之前执行了什么操作。我应该使用Session变量来保持范围变化吗?动作过滤器是一种更好的重新考虑我的应用程序的方法吗?任何有代码示例的建议都表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

我最终创建了一个新的控制器,其中包含一个动作来创建会话变量,然后执行重定向。在Repository中,会检查会话变量以查看它是否与用户的主站点相同。如果会话变量的范围不同,则返回值。 SiteController.Index()的Index.aspx返回一个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;
    }
}