web-dev-qa-db-fra.com

ViewBag, ViewData, TempData, Session - comment et quand les utiliser?

ViewData et ViewBag vous permettent d'accéder à toutes les données de la vue transmises par le contrôleur.

La principale différence entre les deux réside dans la manière dont vous accédez aux données. Dans ViewBag, vous accédez à des données en utilisant des chaînes en tant que clés - ViewBag [“numbers”]. Dans ViewData, vous accédez à des données en utilisant des propriétés - ViewData.numbers.

ViewData exemple

MANETTE

 var Numbers = new List<int> { 1, 2, 3 };

          ViewData["numbers"] = Numbers;

VUE

<ul>
 @foreach (var number in (List<int>)ViewData["numbers"])
 {
     <li>@number</li> 
 }

 </ul>

ViewBag exemple

MANETTE

 var Numbers = new List<int> { 1, 2, 3 };

         ViewBag.numbers = Numbers;

VUE

<ul>

@foreach (var number in ViewBag.numbers)

{
<li>@number</li> 
}

</ul>

Session est un autre objet très utile qui contiendra toutes les informations.

Par exemple, lorsque l'utilisateur est connecté au système, vous souhaitez conserver son niveau d'autorisation.

// GetUserAuthorizationLevel - some method that returns int value for user authorization level.

Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID);

Ces informations seront stockées dans la session tant que la session de l'utilisateur est active. Cela peut être changé dans le fichier Web.config:

<system.web>
    <sessionState mode="InProc" timeout="30"/>

Alors, dans le contrôleur à l'intérieur de l'action:

 public ActionResult LevelAccess()
     {
         if (Session["AuthorizationLevel"].Equals(1))
         {
             return View("Level1");
         }

        if (Session["AuthorizationLevel"].Equals(2))
        {
            return View("Level2");
        }

        return View("AccessDenied");
    }

TempData est très similaire à ViewData et ViewBag, mais il ne contiendra des données que pour une requête.

MANETTE

// Vous avez créé une méthode pour ajouter un nouveau client.

TempData["ClientAdded"] = "Client has been added";

VUE

@if (TempData["ClientAdded"] != null)
{ 
   <h3>@TempData["ClientAdded"] </h3>
}

TempData est utile lorsque vous souhaitez transmettre des informations de View à Controller. Par exemple, vous souhaitez conserver l'heure à laquelle la vue a été demandée.

VUE

@{
TempData["DateOfViewWasAccessed"] = DateTime.Now;
}

MANETTE

if (TempData["DateOfViewWasAccessed"] != null)
   {
    DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString()); 
   }
13
Adam Bielecki

ViewBag, ViewData, TempData, Session - comment et quand les utiliser?

ViewBag

L'éviter. Utilisez un modèle de vue quand vous le pouvez.

La raison en est que lorsque vous utilisez des propriétés dynamiques, vous ne recevrez pas d'erreurs de compilation. Il est très facile de changer un nom de propriété par accident ou par but, puis d’oublier de mettre à jour tous les usages.

Si vous utilisez un ViewModel, vous n'aurez pas ce problème. Un modèle de vue déplace également la responsabilité de l'adaptation du "M" (c'est-à-dire des entités commerciales) dans MVC du contrôleur et de la vue au ViewModel. Vous obtenez ainsi un code plus propre avec des responsabilités claires.

Action

public ActionResult Index()
{
    ViewBag.SomeProperty = "Hello";
    return View();
}

Voir (syntaxe de rasoir)

@ViewBag.SomeProperty

ViewData

L'avoit. Utilisez un modèle de vue quand vous le pouvez. Même raison que pour ViewBag.

Action

public ActionResult Index()
{
    ViewData["SomeProperty"] = "Hello";
    return View();
}

Vue (syntaxe de rasoir):

@ViewData["SomeProperty"]

Données temporaires

Tout ce que vous stockez dans TempData restera dans tempdata jusqu'à ce que vous le lisiez, peu importe s'il y a une ou plusieurs requêtes HTTP entre les deux.

Actes

public ActionResult Index()
{
    TempData["SomeName"] = "Hello";
    return RedirectToAction("Details");
}


public ActionResult Details()
{
    var someName = TempData["SomeName"];
}
17
jgauffin

TempData

est censé être une instance de très courte durée, et vous ne devriez l'utiliser que pendant les requêtes en cours et suivantes uniquement! Puisque TempData fonctionne de cette façon, vous devez savoir avec certitude quelle sera la prochaine requête. La redirection vers une autre vue est le seul moment où vous pouvez le garantir. Par conséquent, le seul scénario dans lequel l'utilisation de TempData fonctionnera de manière fiable est celui de la redirection. En effet, une redirection supprime la requête en cours (et envoie le code d'état HTTP 302 Object Moved au client), puis crée une nouvelle requête sur le serveur afin de servir la vue redirigée. En regardant en arrière l'exemple de code HomeController précédent, cela signifie que l'objet TempData pourrait donner des résultats différents de ceux attendus, car la requête suivante Origine ne peut pas être garantie. Par exemple, la demande suivante peut provenir d'une instance d'ordinateur et de navigateur complètement différente.

ViewData

ViewData est un objet de dictionnaire dans lequel vous insérez des données, qui devient ensuite disponible pour la vue. ViewData est un dérivé de la classe ViewDataDictionary, vous pouvez donc y accéder avec la syntaxe familière "clé/valeur".

ViewBag

L'objet ViewBag est un wrapper autour de l'objet ViewData qui vous permet de créer des propriétés dynamiques pour ViewBag.

public class HomeController : Controller
{
    // ViewBag & ViewData sample
    public ActionResult Index()
    {
        var featuredProduct = new Product
        {
            Name = "Special Cupcake Assortment!",
            Description = "Delectable Vanilla and chocolate cupcakes",
            CreationDate = DateTime.Today,
            ExpirationDate = DateTime.Today.AddDays(7),
            ImageName = "cupcakes.jpg",
            Price = 5.99M,
            QtyOnHand = 12
        };

        ViewData["FeaturedProduct"] = featuredProduct;
        ViewBag.Product = featuredProduct;
        TempData["FeaturedProduct"] = featuredProduct;  

        return View();
    }
}
3
user1968030
namespace TempData.Controllers
{
 public class HomeController : Controller
 {
    public ActionResult Index()
    {
        TempData["hello"] = "test"; // still alive
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        //ViewBag.Message = "Your application description page.";
        var sonename = TempData["hello"]; // still alive (second time)
        return RedirectToAction("Contact");
    }


    public ActionResult Contact()
    {
        var scondtime = TempData["hello"]; // still alive(third time)
        return View();
    }
    public ActionResult afterpagerender()
    {
        var scondtime = TempData["hello"];//now temp data value becomes null

        return View();
    }
}

}

Dans la conversation ci-dessus, il y a peu de confusion pour tout le monde. si vous regardez mon code ci-dessus, tempdata est comme le concept viewdata mais il est alors capable de rediriger une autre vue également. c'est le premier point.

deuxième point: peu d’entre eux disent qu’il conserve sa valeur jusqu’à sa lecture et peu d’entre eux le demandent, alors il lira seulement du temps? pas vraiment. En fait, vous pouvez lire n'importe quel nombre de fois dans votre code dans un postpack avant le rendu de la page. une fois que le rendu de la page est arrivé, si vous répétez postpack (demande) signifie, la valeur tempdata devient NULL.

même si vous demandez beaucoup de temps, mais la valeur tempdata est toujours active -> dans ce cas, votre nombre de demandes ne doit pas lire la valeur des données temporaires.

0
user3234419

En termes simples:

ViewBag est un objet dynamique (dynamique: possibilité d'affecter plus d'une valeur par différents programmes sur le même objet) utilisé pour envoyer des données d'un contrôleur à une vue. Il peut être utilisé lorsque nous passons d'une action du contrôleur à une vue. Cependant, la valeur que nous obtenons dans la vue (dans l'objet viewbag) ne peut plus être répliquée dans une autre page vue/contrôleur/js, etc. Signification: Contrôleur-> Vue (possible). Maintenant, cette valeur ne peut pas être envoyée à la vue/au contrôleur suivant. Signification Controller-> View-> View/controller/un fichier js (impossible), pour porter cette valeur, vous devez définir une autre variable et y stocker la valeur de viewbag, puis l'envoyer en tant que paramètre.

Tempdata est très différent de viewbag. Cela n'a rien à voir avec la vue. Il est utilisé lorsque nous envoyons des données d'une action (méthode) à une autre action du même contrôleur. C'est la raison pour laquelle nous utilisons RedirectToAction lors de l'envoi d'une valeur tempdata d'une action à une autre. Les valeurs de tempdata ne sont pas conservées lors de l'envoi du contrôleur à la vue (car ce n'est pas censé le faire).

ViewData est similaire à viewbag mais est un objet dictionnaire. ViewData peut nécessiter un transtypage, contrairement à viewbag. Cela dépend de l'utilisateur qu'il souhaite utiliser.

0
Bhawishya