我们的架构师已经要求我找到一种方法来捕获MVC页面上的状态信息,这些信息无法使用@model进行正常捕获。目前,我使用Ajax的组合将信息发送到控制器,然后控制器接收它并将其推送到Session变量中以便根据需要进行拾取。该解决方案旨在成为可以插入任何未来项目的框架的一部分。
问题是,它的Ajax部分是通用的;它可以被推入任何MVC页面,并将完成它的工作。不幸的是,控制器部分不是那么通用,需要为每个项目定义。
所以,我的问题是:有没有办法直接从调用页面填充会话变量(有或没有ajax)。它也不需要是会话变量,它可以是TempData甚至是静态变量,只要解决方案可以放入项目X并根据需要获取信息。
如果有办法将一个通用插入项目,我也不会反对使用控制器。因此,虽然我的问题是关于Ajax和Session变量,但它可以解决任何允许我将当前表单状态推送到可以使用它而只需对Project X进行最少修改的地方。
欢迎任何和所有建议。 :)
答案 0 :(得分:1)
您可以定义MVC项目中所有其他控制器派生自的BaseController
。 BaseController
将有一个ActionFilter来捕获可在项目中的MVC页面上访问的状态信息。此ActionFilter将在每个ActionResult
方法之前执行。
[Authorize]
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session != null)
{
// You can even have any custom logic in here
string userName = HttpContext.User.Identity.Name;
if (Session["logonUser"] == null)
{
Session["logonUser"] = userName.Length > 1 ? userName.ToUpper() : "INVALID USER";
}
}
}
}
然后在各自的MVC页面中,您可以派生出类似
的BaseController public class ReportsController : BaseController
{
.....
.....
}