Как использовать сеансы в приложении ASP.NET MVC 4?

Я новичок в ASP.NET MVC. Раньше я использовал PHP, и было легко создать сеанс и выбрать записи пользователя на основе текущих переменных сеанса.

Я просмотрел всюду в Интернете для простого пошагового руководства, которое может показать мне, как создавать и использовать сеансы в моем приложении С# ASP.NET MVC 4. Я хочу создать сеанс с пользовательскими переменными, к которым я могу получить доступ из любого места в своих контроллерах, и иметь возможность использовать переменные в моих запросах LINQ.

- Спасибо заранее!

Ответ 1

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;

Ответ 2

Из-за безгражданности веб-сайта сеансы также являются чрезвычайно полезным способом сохранения объектов через запросы путем их сериализации и хранения в сеансе.

Идеальный вариант использования этого может быть, если вам нужно получить доступ к регулярной информации в вашем приложении, чтобы сохранить дополнительные запросы к базе данных по каждому запросу, эти данные могут быть сохранены в объекте и неэтериализованы для каждого запроса, например:

Наш многоразовый, сериализуемый объект:

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

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

Случай использования:

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 */
    }

}

Как только этот объект был сериализован, мы можем использовать его во всех контроллерах без необходимости его создания или снова запрашивать базу данных для содержащихся в ней данных.

Внедрить свой объект сеанса с помощью инъекции зависимостей

В идеальном мире вы бы программировали интерфейс, а не реализацию, и вставляете свой сериализуемый объект сеанса в свой контроллер, используя ваш контейнер Inversion of Control по выбору, (этот пример использует StructureMap, поскольку он наиболее знаком с).

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;
    }
}

Затем вы зарегистрировали бы это в своем файле Global.asax.cs.

Для тех, кто не знаком с инъекционными объектами сеанса, вы можете найти более подробное сообщение в блоге о теме здесь.

Слово предупреждения:

Стоит отметить, что сеансы должны быть сведены к минимуму, большие сеансы могут вызвать проблемы с производительностью.

Также рекомендуется не хранить в них конфиденциальные данные (пароли и т.д.).

Ответ 3

Вот как работает состояние сеанса в ASP.NET и ASP.NET MVC:

Обзор состояния сеанса ASP.NET

В основном, вы делаете это, чтобы сохранить значение в объекте Session:

Session["FirstName"] = FirstNameTextBox.Text;

Чтобы получить значение:

var firstName = Session["FirstName"];

Ответ 4

U может хранить любое значение в сеансе, например Session [ "FirstName" ] = FirstNameTextBox.Text; но я предлагаю u взять в качестве статического поля значение присвоения модели, и вы можете получить доступ к этому значению поля где угодно в приложении. U не требуется сеанс. сеанса следует избегать.

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

на контроллере - Employee.FullName = "ABC"; Теперь вы можете получить доступ к этому полному имени в любом месте приложения.