如何在MVC 3中的控制器动作之间共享会话变量?

时间:2014-07-15 14:49:50

标签: asp.net-mvc session

我在第一个视图中有一个gridPanel。如果单击此视图中的按钮,则所选行将显示在另一个视图中。我需要将这些行的信息发送到服务器,以便我可以在单击按钮的操作中加载一些额外的数据。 要执行该操作,我应该使用Session而不是TempData或ViewBag / ViewData,因为我不知道用户何时会单击该按钮。如果我弄错了,请纠正我。

我的代码是这样的:在客户端使用AJAX我调用一个动作方法来设置会话变量:

Ext.Ajax.request({ url: 'Examples/SetSelectedStations', params: { selectedStations: stationsStr} });

SetSelectedStations控制器中设置了Session["selected"],因此控制器操作就像:

public ViewResult SetSelectedStations(string selectedStations)
        {
            Session["selected"] = selectedStations;
            return View();
        }

我想在另一个名为Session["selected"]的控制器中获取ShowSelectedStations

public Ext.Net.MVC.PartialViewResult ShowSelectedStations(string containerId)
        {
            string ss = Session["selected"] as string;
            // Here ss is null !!!       
        }

问题是Session["selected"]在第二个控制器中始终为空! 我应该在其他地方定义Session [“selected”]吗? web.confg文件中是否有特殊配置?

请注意我的web.config中的sessionState是这样的:

<sessionState mode="Custom" customProvider="PgSessionStateStoreProvider">
      <providers>
        <clear />
        <add name="PgSessionStateStoreProvider" type="NauckIT.PostgreSQLProvider.PgSessionStateStoreProvider" enableExpiredSessionAutoDeletion="true" expiredSessionAutoDeletionInterval="1800000" enableSessionExpireCallback="false" connectionStringName="AspSQLProvider" applicationName="WebSite1" />
      </providers>
    </sessionState>

和global.asax:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace WIS_3_0
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Examples", action = "Ex3", id = UrlParameter.Optional } // Parameter defaults
            );

        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

0 个答案:

没有答案