2014-10-02 78 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