MVC ViewBag Best Practice

pour le viseur, j'ai entendu dire que c'était un non-non à utiliser. Je suppose que le contenu du ViewBag devrait être incorporé dans un modèle de vue?

Question:

  1. est mon hypothèse au-dessus de la meilleure pratique. (Pour ne pas utiliser un ViewBag et la seconde pour l'avoir dans le modèle de vue)

  2. y a-t-il des situations où un sac de vision est absolument nécessaire?

28
demandé sur tereško 2012-06-29 16:45:15

9 réponses

ViewBag est un dictionnaire dynamique. Ainsi, lorsque vous utilisez ViewBag pour transférer des données entre les méthodes d'action et les vues, votre compilateur ne sera pas en mesure d'attraper si vous faites une faute de frappe dans votre code en essayant d'accéder à l'élément ViewBag dans votre vue. Votre vue s'écrasera au moment de l'exécution: (

en général, c'est une bonne idée d'utiliser un modèle de vue pour transférer des données entre vos méthodes d'action et vues. view model est une classe POCO simple qui possède des propriétés spécifiques à la vue. Donc, si vous souhaitez passer quelques données supplémentaires à afficher, d'Ajouter une nouvelle propriété à votre modèle de vue et l'utiliser.Les vues fortement tapées rendent le code plus propre et plus facile à entretenir. Avec cette approche, vous n'avez pas besoin de faire une conversion explicite de votre viewbag article de dictionnaire pour certains types d'avant en arrière qui vous avez à faire avec vue sac.

public class ProductsForCategoryVm
{
  public string CategoryName { set;get; }
  public List<ProductVm> Products { set;get;}    
}
public class ProductVm
{
  public int Id {set;get;} 
  public string Name { set;get;}
}

et dans votre méthode d'action, créez un objet de ce modèle de vue, chargez les propriétés et envoyez-le à la vue.

public ActionResult Category(int id)
{
  var vm= new ProductsForCategoryVm();
  vm.CategoryName = "Books";
  vm.Products= new List<ProductVm> {
     new ProductVm { Id=1, Name="The Pragmatic Programmer" },
     new ProductVm { Id=2, Name="Clean Code" }
  }
  return View(vm);
}

Et votre point de vue, qui est fortement typé, à la vue du modèle,

@model ProductsForCategoryVm
<h2>@Model.CategoryName</h2>
@foreach(var item in Model.Products)
{
    <p>@item.Name</p>
}

liste Déroulante de données ?

un grand nombre de tutoriels/livres a des échantillons de code qui utilise ViewBag pour les données dropdown. Personnellement, je pense toujours que Viewbag's ne devrait pas être utilisé pour cela. Il doit s'agir d'une propriété de type List<SelectListItem > dans votre modèle view pour transmettre les données de la liste déroulante. Voici un post avec Exemple de code sur la façon de faire cela.

y a-t-il des situations où un sac de vision est absolument nécessaire?

il y a quelques cas d'utilisation valide où vous pouvez ( pas nécessaire ) utiliser ViewBag pour envoyer des données. Par exemple, vous souhaitez afficher quelque chose sur votre page de Mise en page, vous pouvez utiliser ViewBag. Un autre exemple est ViewBag.Title (pour le titre de la page ) présent dans le modèle MVC par défaut.

public ActionResult Create()
{
   ViewBag.AnnouncementForEditors="Be careful";
   return View();
}

et dans la mise en page, vous pouvez lire le ViewBag.AnnouncementForEditors

<body>
<h1>@ViewBag.AnnouncementForEditors</h1>
<div class="container body-content">
    @RenderBody()
</div>
</body>
26
répondu Shyju 2017-05-23 12:18:14

1) est mon hypothèse au-dessus de la meilleure pratique. (Ne pas utiliser un ViewBag et deuxième de l'avoir dans le modèle de vue)

vous devez utiliser des modèles de vue au lieu de passer des données via le paquet de vue autant que possible.

2) y a-t-il des situations où un sac-image est absolument nécessaire?

il n'y a pas de situation où un sac-image est absolument nécessaire. Cependant, il y a certaines données que je préfère personnellement utiliser ViewBag au lieu de View Model. Par exemple, lorsque j'ai besoin de remplir une boîte déroulante pour des valeurs prédéfinies (I. e Cities), j'utilise ViewBag pour transporter le tableau SelectListItem à view. Je préfère ne pas polluer mes modèles avec ces données.

29
répondu SadullahCeran 2012-06-29 13:31:37

1) est mon hypothèse au-dessus de la meilleure pratique. (Ne pas utiliser un ViewBag et deuxième de l'avoir dans le modèle de vue)

Oui.

2) y a-t-il des situations où un sac-image est absolument nécessaire?

Pas de. Tout ce que vous avez stocké dans un ViewBag pourrait entrer dans le modèle de vue passé à la vue.

4
répondu Darin Dimitrov 2012-06-29 12:49:46

le problème avec les vignettes et les bonnes pratiques recommandées se résume à compiler la vérification du temps. Les ViewBags sont juste des dictionnaires et avec cela vous obtenez des chaînes 'magic', donc si vous finissez par changer le type d'objet d'un des éléments de viewbag ou le nom de la clé vous ne saurez pas jusqu'à l'exécution, même si vous précompilez les vues en utilisant <MvcBuildViews>true</MvcBuildViews> .

coller aux modèles de vue est préférable, même si vous devez les Modifier pour s'adapter à une vue spécifique de temps en temps.

4
répondu Chris S 2012-06-29 12:54:37

j'ai trouvé une certaine utilisation pour ViewBag où il y a une fonctionnalité commune à travers toutes les pages, et la fonctionnalité ne dépend pas de la page affichée. Par exemple, disons que vous construisez un débordement des piles. Le tableau des emplois apparaît sur chaque page, mais les emplois présentés n'ont rien à voir avec la page (Mon usage était similaire dans le concept). Ajouter une propriété à chaque modèle de vue serait difficile et fastidieux, et un lot de fluff à vos tests. Je ne pense pas que cela vaut c'est dans cette situation.

j'ai utilisé une classe de ViewModel de base avec les données transversales, mais si vous en avez plus d'une (par exemple, jobs & list of stack exchange sites), vous devez soit commencer à bourrer des données supplémentaires, ou un autre abus d'un ViewModel, plus vous avez besoin d'un constructeur de ViewModel pour peupler les données de base.

quant au problème des cordes magiques, il y a beaucoup de solutions. Constantes, méthodes d'extension, etc.

avec tout cela dit, si vous avez quelque chose qui est affiché sur votre page, qui dépend du contexte de la page, un ViewModel est votre ami.

Erick

2
répondu Erick T 2012-06-29 18:44:59

si vous ne pouvez pas re-concevoir ViewModel existant utiliser ViewBag.

1
répondu Academy of Programmer 2013-10-17 16:25:28
  1. Pas de. Utilisez ViewModels .
  2. Pas de. Si vous concevez un modèle de vue parfait, vous n'avez jamais besoin d'un sac de vue.
0
répondu Tohid 2012-06-29 12:48:49

2.Y a-t-il des situations où un sac de vision est absolument nécessaire?

dans certains cas, vous aurez besoin de partager vos données à partir du contrôleur à travers les layouts, les vues et les vues partielles. Dans ce cas, ViewBag est très utile et je doute qu'il y ait une meilleure façon.

0
répondu Dinh Tran 2017-10-19 02:54:29

S'il n'y avait pas de cas d'utilisation pour elle, il ne serait pas mis en œuvre en premier lieu. Oui, vous pouvez tout faire avec Viewmodel, mais que faire si vous n'avez pas vraiment besoin? L'un de ces scénarios consiste à éditer des entités. Vous pouvez passer DTO directement comme modèle.

@model CategoryDto
<div class="md-form form-sm">
    <input asp-for="Name" class="form-control">
    <label asp-for="Name">("Category Name")</label>
</div>

mais que faire si vous voulez sélectionner la catégorie parent? Entité DTO contient idéalement seulement ses propres valeurs, ainsi pour peupler la liste select vous utilisez ViewBag

<select asp-for="ParentId" asp-items="ViewBag.ParentList">
    <option value="">None</option>
</select>

Pourquoi faire cela? Eh bien, si vous avez 50 types d'entités chacun avec une sorte de choisir parmi des valeurs différentes, vous avez juste évité de créer 50 modèles de vue supplémentaires.

0
répondu Xeevis 2018-01-13 00:56:33