Jeg er ny i ASP.NET MVC. Jeg har brukt PHP tidligere, og det var enkelt å opprette en økt og velge brukeroppføringer basert på de aktuelle øktvariablene.
Jeg har lett overalt på Internett etter en enkel trinnvis veiledning som kan vise meg hvordan jeg oppretter og bruker økter i C# ASP.NET MVC 4-applikasjonen min. Jeg ønsker å opprette en økt med brukervariabler som jeg kan få tilgang til hvor som helst i kontrollerne mine og bruke variablene i LINQ-spørringene mine.
-Takk på forhånd!
Prøv
//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;
På grunn av nettets tilstandsløse natur er økter også en svært nyttig måte å bevare objekter på tvers av forespørsler ved å serialisere dem og lagre dem i en økt.
Et perfekt eksempel på dette kan være hvis du har behov for å få tilgang til regelmessig informasjon på tvers av applikasjonen, slik at du slipper ekstra databasekall for hver enkelt forespørsel:
Vårt gjenbrukbare, serialiserbare objekt:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Bruksområde:
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 */
}
}
Når dette objektet er serialisert, kan vi bruke det i alle kontrollerne uten å måtte opprette det eller søke i databasen etter dataene det inneholder på nytt.
**Injiser øktobjektet ved hjelp av Dependency Injection.
I en ideell verden ville du 'program to an interface, not implementation' og injisere det serialiserbare sesjonsobjektet i kontrolleren ved hjelp av den valgte Inversion of Control-containeren, for eksempel slik (i dette eksemplet brukes StructureMap, siden det er den jeg er mest kjent med).
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;
}
}
Deretter registrerer du dette i filen Global.asax.cs
.
For de som ikke er kjent med injisering av sesjonsobjekter, kan du finne et mer utfyllende blogginnlegg om emnet her.
**En liten advarsel
Det er verdt å merke seg at antall økter bør holdes på et minimum, da store økter kan føre til ytelsesproblemer.
Det anbefales også å ikke lagre sensitive data i dem (passord osv.).
Slik fungerer øktstatus i ASP.NET og ASP.NET MVC:
Oversikt over øktstatus i ASP.NET.
I utgangspunktet gjør du dette for å lagre en verdi i Session-objektet:
Session["FirstName"] = FirstNameTextBox.Text;
For å hente verdien:
var firstName = Session["FirstName"];