web-dev-qa-db-fra.com

Créer un cookie ASP.NET et MVC

J'ai un problème assez simple - je veux créer un cookie sur un client, qui est créé par le serveur. J'ai trouvé beaucoup de pages qui décrivent comment l'utiliser - mais je suis toujours resté au même point.

J'ai un DBController qui est invoqué lorsqu'il y a une demande à la base de données.

Le constructeur du DBController est comme ceci:

public class DBController : Controller
{
    public DBController()
    {
        HttpCookie StudentCookies = new HttpCookie("StudentCookies");
        StudentCookies.Value = "hallo";
        StudentCookies.Expires = DateTime.Now.AddHours(1);
        Response.Cookies.Add(StudentCookies);
        Response.Flush();
    }

    [... more code ...]

}

J'obtiens l'erreur "Référence d'objet non définie sur une instance d'un objet" à:

StudentCookies.Expire = DateTime.Now.AddHours(1)

C'est une sorte de message d'erreur basique - alors quel genre de chose basique j'ai oublié?

15
yesfabime

Le problème est que vous ne pouvez pas ajouter à la réponse dans le constructeur du contrôleur. L'objet Response n'a pas été créé, il obtient donc une référence nulle, essayez d'ajouter une méthode pour ajouter le cookie et l'appeler dans la méthode d'action. Ainsi:

private HttpCookie CreateStudentCookie()
{
    HttpCookie StudentCookies = new HttpCookie("StudentCookies");
    StudentCookies.Value = "hallo";
    StudentCookies.Expires = DateTime.Now.AddHours(1);
    return StudentCookies;
}

//some action method
Response.Cookies.Add(CreateStudentCookie());
21
James Ralston

Utilisez Response.SetCookie (), car Response.Cookie.Add () peut ajouter plusieurs cookies tandis que SetCookie () mettra à jour un cookie existant. Je pense donc que votre problème peut être résolu.

public DBController()
{
    HttpCookie StudentCookies = new HttpCookie("StudentCookies");
    StudentCookies.Value = "hallo";
    StudentCookies.Expires = DateTime.Now.AddHours(1);
    Response.SetCookie(StudentCookies);
    Response.Flush();
}
9
Shekhar Patel

Vous pouvez utiliser la méthode Initialize() du contrôleur au lieu du constructeur. Dans la fonction d'initialisation, l'objet Request est disponible. Je soupçonne que la même action peut être effectuée avec le Responseobject.

0
Radu