在另一个Controller中设置会话数据

时间:2014-11-18 16:22:38

标签: c# ajax asp.net-mvc

我有一个MVC项目,它有两个控制器ReportsControllerReportViewerController

我在ReportsController中有一个方法,我从ajax中调用

    public void Report(ReportWrapper pW)
    {
        Dictionary<string, object> pParameters = new Dictionary<string, object>();
        pParameters.Add("GroupIdents", pW.pGroupIdents);

        ReportViewerController rvc = new ReportViewerController();
        rvc.Session = Session; // Can't be assigned to
        rvc.SetReportValues(pW.pReportName, pParameters);
    }

我想在ReportViewerController

中调用此方法
    public void SetReportValues(string pReportName, Dictionary<string, object> pParameters)
    {
        Session["ReportName"] = pReportName;
        Session["ReportParameters"] = pParameters;
    }

但是ReportViewerController中的会话为空,我该如何设置/初始化它?

1 个答案:

答案 0 :(得分:0)

使用服务(帮助程序)类在控制器之间共享公共代码:

public class ReportService()
{
   public void SetReportValues(string pReportName, Dictionary<string, object> pParameters)
   {
      HttpContext.Current.Session["ReportName"] = pReportName;
      HttpContext.Current.Session["ReportParameters"] = pParameters;
   }
}

ReportsController:

public void Report(ReportWrapper pW)
{
    Dictionary<string, object> pParameters = new Dictionary<string, object>();
    pParameters.Add("GroupIdents", pW.pGroupIdents);

    var reportService = new ReportService();     
    reportService.SetReportValues(pW.pReportName, pParameters);
}

ReportViewerController:

public void SetReportValues(string pReportName, Dictionary<string, object> pParameters)
{
    var reportService = new ReportService();     
    reportService.SetReportValues(pW.pReportName, pParameters);
}

此示例使用HttpContext类和手动服务初始化,这不是理想的方法,因为它使测试/扩展代码变得困难。更好的方法是依赖接口而不是具体实现,并使用依赖注入将这些依赖项注入控制器:

http://weblogs.asp.net/gunnarpeipman/asp-net-mvc-moving-code-from-controller-action-to-service-layer http://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency-injection How do I get Unity to inject a reference to HttpSessionState to a service