Jak korzystać z sesji w ASP.NET aplikacja MVC 4?

Jestem nowy w ASP.NET MVC. Używałem już wcześniej PHP i łatwo było utworzyć sesję i wybrać rekordy użytkownika na podstawie bieżących zmiennych sesji.

Szukałem wszędzie w Internecie prostego samouczka krok po kroku, który pokaże mi, jak tworzyć i używać sesji w moim C# ASP.NET aplikacja MVC 4. Chcę utworzyć sesję ze zmiennymi użytkownika, do której będę miał dostęp z dowolnego miejsca w kontrolerach i będę mógł używać zmiennych w moich zapytaniach LINQ.

-dzięki z góry!

Author: Bellash, 2013-01-03

4 answers

Try

//adding data to session
//assuming the method below will return list of Products

var products=Db.GetProducts();

//Store the products to a session

Session["products"]=products;

//To get what you have stored to a session

var products=Session["products"] as List<Product>;

//to clear the session value

Session["products"]=null;
 134
Author: Jobert Enamno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-03 12:34:45

Ze względu na bezpaństwowy charakter sieci, sesje są również niezwykle użytecznym sposobem utrzymywania obiektów w żądaniach poprzez ich serializację i przechowywanie w sesji.

Doskonałym tego przykładem może być, jeśli potrzebujesz dostępu do regularnych informacji w całej aplikacji, aby zapisać dodatkowe wywołania bazy danych przy każdym żądaniu, dane te mogą być przechowywane w obiekcie i niezerializowane przy każdym żądaniu, jak tak:

Nasze wielokrotnego użytku, serializowalne obiekt:

[Serializable]
public class UserProfileSessionData
{
    public int UserId { get; set; }

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

Przypadek użycia:

public class LoginController : Controller {

    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid)
        {
            var profileData = new UserProfileSessionData {
                UserId = model.UserId,
                EmailAddress = model.EmailAddress,
                FullName = model.FullName
            }

            this.Session["UserProfile"] = profileData;
        }
    }

    public ActionResult LoggedInStatusMessage()
    {
        var profileData = this.Session["UserProfile"] as UserProfileSessionData;

        /* From here you could output profileData.FullName to a view and
        save yourself unnecessary database calls */
    }

}

Po serializacji tego obiektu możemy go używać we wszystkich kontrolerach bez potrzeby tworzenia go lub ponownego odpytywania bazy danych o zawarte w nim dane.

Inject your session object using Dependency Injection

W idealnym świecie można 'program do interfejsu, a nie implementacji ' i wstrzyknąć obiekt sesji serializowalnej do kontrolera za pomocą inwersji Kontener kontrolny wyboru, tak jak tak (ten przykład używa StructureMap, ponieważ jest to ten, z którym jestem najbardziej zaznajomiony).

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());   
    }

    public static IUserProfileSessionData GetUserProfileFromSession()
    {
        var session = HttpContext.Current.Session;
        if (session["UserProfile"] != null)
        {
            return session["UserProfile"] as IUserProfileSessionData;
        }

        /* Create new empty session object */
        session["UserProfile"] = new UserProfileSessionData();

        return session["UserProfile"] as IUserProfileSessionData;
    }
}

Następnie zarejestrujesz to w swoim pliku Global.asax.cs.

Dla tych, którzy nie są zaznajomieni z wstrzykiwaniem obiektów sesji, możesz znaleźć bardziej szczegółowy wpis na blogu na ten temat tutaj.

Słowo ostrzeżenia:

Warto zauważyć, że sesje powinny być ograniczone do minimum, Duże sesje mogą zacząć powodować wydajność problemy.

Zaleca się również, aby nie przechowywać w nich żadnych poufnych danych (haseł itp.).

 52
Author: Joseph Woodward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:41

Tak działa stan sesji w ASP.NET oraz ASP.NET MVC:

ASP.NET przegląd stanu sesji

Zasadniczo, robisz to, aby zapisać wartość w obiekcie Sesji:

Session["FirstName"] = FirstNameTextBox.Text;

Aby pobrać wartość:

var firstName = Session["FirstName"];
 15
Author: Leniel Maccaferri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-03 12:25:00

U można zapisać dowolną wartość w sesji jak Session ["FirstName"] = FirstNameTextBox.Tekst; ale zasugeruję u wziąć jako statyczne pole w modelu przypisać wartość do niego i u może uzyskać dostęp do tej wartości pola w dowolnym miejscu w aplikacji. Nie potrzebujesz sesji. należy unikać sesji.

public class Employee
{
   public int UserId { get; set; }
   public string EmailAddress { get; set; }
   public static string FullName { get; set; }
}

On controller-Employee.FullName = " ABC"; Teraz możesz uzyskać dostęp do tej pełnej nazwy w dowolnym miejscu w aplikacji.

 -7
Author: Mukul Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-30 04:49:57