我有一个MVC项目,它有两个控制器ReportsController
和ReportViewerController
。
我在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
中的会话为空,我该如何设置/初始化它?
答案 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