2014-10-02 70 views
0

我们的建筑师问我如何找到一种方法来捕获MVC页面上的状态信息,该信息无法通过@model正常捕获。目前,我正在使用Ajax的组合将信息发送给控制器,然后控制器将其取出并将其推入Session变量,以便根据需要进行拾取。此解决方案旨在成为可插入任何未来项目的框架的一部分。通过.NET中的AJAX直接填充会话变量MVC

问题是,它的Ajax部分是通用的;它可以被推入任何MVC页面并将完成其工作。不幸的是,控制器部分不是很通用,需要为每个项目定义。

所以,对我的问题:是否有任何方法来直接从调用页面填充会话变量(带或不带ajax)。它不需要是会话变量,它可以是TempData或甚至是静态变量,只要解决方案可以放入项目X并根据需要选取信息即可。

我也不反对使用控制器,如果有一种方法可以将其中一种插入到项目中。所以,虽然我的问题是关于Ajax和会话变量,但任何解决方案都是开放的,它允许我将当前表单状态推送到可以对Project X进行最小修改的地方。

欢迎任何和所有建议。 :)

回答

1

您可以定义一个BaseController MVC项目中的所有其他控制器将派生自。 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 
{ 
    ..... 
    ..... 
} 
+1

打我吧,我打字了几乎同样的事情。 +1 – guildsbounty 2014-10-02 18:14:40

+1

作为一种替代方案(如果您仍然想使用AJAX ...说您需要的数据是在页面上生成的),请将AJAX函数在此基本控制器中调用的Action放在该处,然后从中调用它。然后将AJAX功能粘贴在主页面上。 – guildsbounty 2014-10-02 18:15:58

+0

@guildsbounty我同意。 – 2014-10-02 18:19:25