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