ASP.NET MVC 3-Partial vs Display Template vs Editor Template

ainsi, le titre devrait parler pour lui-même.

Pour créer des composants réutilisables dans ASP.NET MVC, nous avons 3 options (peut-être d'autres que je n'ai pas mentionné):

Vue Partielle:

@Html.Partial(Model.Foo, "SomePartial")

Personnalisé Éditeur De Modèle:

@Html.EditorFor(model => model.Foo)

Affichage Personnalisé De Modèle:

@Html.DisplayFor(model => model.Foo)

en termes de the actual View / HTML, les trois implémentations sont identiques:

@model WebApplications.Models.FooObject

<!-- Bunch of HTML -->

Donc, ma question est - quand/comment voulez-vous décider lequel des trois?

ce que je cherche vraiment, c'est une liste de questions à vous poser avant d'en créer une, pour laquelle les réponses peuvent être utilisées pour décider du modèle à utiliser.

Voici les 2 choses que J'ai trouvé mieux avec EditorFor / DisplayFor:

  1. ils respectent les hiérarchies des modèles lorsqu'ils rendent des helpers HTML (E. g Si vous avez un objet "Bar" sur votre modèle "Foo", les éléments HTML pour "Bar" seront rendus avec "Foo".Bar.ElementName", tandis qu'un partial aura "ElementName").

  2. plus robuste, E. g Si vous avez un List<T> de quelque chose dans votre modèle de vue, vous pouvez utiliser @Html.DisplayFor(model => model.CollectionOfFoo) , et MVC est assez intelligent pour voir qu'il s'agit d'une collection et affichage unique pour chaque élément (par opposition à un affichage partiel, qui nécessiterait une boucle explicite).

J'ai aussi entendu DisplayFor rendre un modèle" en lecture seule", mais je ne comprends pas que-ne puis - je pas jeter un formulaire là-dessus?

Quelqu'un peut-il me donner d'autres raisons? Y a-t-il une liste ou un article qui compare les trois?

298
demandé sur rene 2011-02-18 07:22:51

5 réponses

EditorFor vs DisplayFor est simple. La sémantique des méthodes est de générer des vues edit/insert et display/read only (respectivement). Utilisez DisplayFor lorsque vous affichez des données (c'est-à-dire lorsque vous générez des divs et des portées qui contiennent les valeurs du modèle). Utilisez EditorFor lorsque vous éditez / insérez des données (c.-à-d. lorsque vous générez des balises de saisie à l'intérieur d'un formulaire).

les méthodes ci-dessus sont centrées sur le modèle. Cela signifie qu'ils tiendront compte des métadonnées du modèle (pour exemple vous pourriez annoter votre classe de modèle avec [UIHintAttribute] ou [DisplayAttribute] et cela influencerait quel modèle est choisi pour générer L'interface utilisateur pour le modèle. Ils sont aussi généralement utilisés pour les modèles de données (c'est-à-dire les modèles qui représentent des lignes dans une base de données, etc.)

d'autre part Partial est centré sur la vue en ce que vous êtes principalement concernés par le choix de la vue partielle correcte. La vue n'a pas nécessairement besoin d'un modèle pour fonctionner correctement. Il peut juste avoir un ensemble commun de balisage qui est réutilisé dans l'ensemble du site. Bien sûr, souvent vous voulez affecter le comportement de cette partielle dans lequel cas vous pourriez vouloir passer dans un modèle de vue approprié.

vous n'avez pas demandé à propos de @Html.Action qui mérite également une mention ici. Vous pourriez penser que c'est une version plus puissante de Partial en ce sens qu'elle exécute une action enfant du contrôleur puis rend une vue (qui est habituellement une vue partielle). Ceci est important parce que l' l'action enfant peut exécuter une logique commerciale supplémentaire qui n'a pas sa place dans une vue partielle. Par exemple, il pourrait représenter un élément de panier d'achat. La raison de l'utiliser est d'éviter d'effectuer le travail lié au panier dans chaque contrôleur de votre application.

finalement, le choix dépend de ce que vous modélisez dans votre application. Rappelez-vous aussi que vous pouvez mélanger et assortir. Par exemple, vous pouvez avoir une vue partielle qui appelle le EditorFor Helper. Cela dépend vraiment de ce qu'est votre application et de la façon de la prendre en compte pour encourager une réutilisation maximale du code tout en évitant la répétition.

291
répondu marcind 2013-08-25 08:39:24

Vous avez certainement pourrait personnaliser DisplayFor pour afficher un formulaire éditable. Mais la convention stipule que DisplayFor doit être readonly et EditorFor doit être édité. S'en tenir à la convention permettra de s'assurer que peu importe ce que vous passez dans DisplayFor , il fera le même type de chose.

14
répondu Robert Levy 2013-08-16 07:54:42

juste pour donner ma valeur 2c, notre projet utilise une vue partielle avec plusieurs onglets jQuery, et chaque onglet rendant ses champs avec sa propre vue partielle. Cela fonctionnait bien jusqu'à ce que nous ajoutions une fonctionnalité par laquelle certains des onglets partageaient des champs communs. Notre première approche pour cela a été de créer une autre vue partielle avec ces champs communs, mais cela est devenu très clunky en utilisant EditorFor et DropDownListFor pour rendre les champs et les dropdowns. Pour obtenir les identifiants et les noms uniques, nous avons dû rendre les champs avec un préfixe en fonction de la vue partielle qui le rendait:

    <div id="div-@(idPrefix)2" class="toHide-@(idPrefix)" style="display:none">
    <fieldset>
        <label for="@(idPrefix).Frequency">Frequency<span style="color: #660000;"> *</span></label>

        <input name="@(idPrefix).Frequency"
               id="@(idPrefix)_Frequency"
               style="width: 50%;"
               type="text"
               value="@(defaultTimePoint.Frequency)"
               data-bind="value: viewState.@(viewStatePrefix).RecurringTimepoints.Frequency"
               data-val="true"
               data-val-required="The Frequency field is required."
               data-val-number="The field Frequency must be a number."
               data-val-range-min="1"
               data-val-range-max="24"
               data-val-range="The field Frequency must be between 1 and 24."
               data-val-ignore="true"/>

        @Html.ValidationMessage(idPrefix + ".Frequency")

        ... etc

    </fieldset>
</div>

cela est devenu assez laid donc nous avons décidé d'utiliser des gabarits D'éditeur à la place, qui a fonctionné beaucoup plus propre. Nous avons ajouté un nouveau modèle de vue avec les champs communs, ajouté un modèle D'éditeur correspondant, et rendu les champs en utilisant le modèle D'éditeur de différentes vues parent. Le modèle Editor rend correctement les ID et les noms.

donc en bref, un la raison impérieuse pour nous d'utiliser des gabarits D'éditeur était le besoin de rendre certains champs communs dans les onglets multiples. Les vues partielles ne sont pas conçues pour cela, mais les modèles D'éditeur gèrent parfaitement le scénario.

13
répondu Ciaran Bruen 2012-02-21 21:00:52

Utiliser _partial vue de l'approche, si:

  1. Afficher Centrique
  2. ce qu'il faut garder tous _partial voir HTML relié dans cette vue seulement. Dans la méthode template, vous devrez conserver un peu de HTML en dehors de la vue Template comme "en-tête principal ou n'importe quel bord externe/paramètres.
  3. Voulez rendre partielle de la vue avec la logique (à Partir de contrôleur) à l'aide de URL.Action("action","controller") .

raisons d'utiliser Modèle:

  1. Voulez supprimer ForEach(Iterator) . Le modèle est suffisant pour identifier le modèle comme type de liste. Il le fera automatiquement.
  2. Modèle Centré Sur La Logique. Si plusieurs vues sont trouvées dans le même dossier displayfor Template, le rendu dépendra du modèle passé.
1
répondu jitendra joshi 2015-12-31 21:23:59

une autre différence qui n'a pas été mentionnée jusqu'à présent est qu'une vue partielle n'ajoute pas de préfixes de modèle alors qu'un modèle n'ajoute pas de préfixes. ici est le problème

1
répondu erhan355 2017-06-14 13:20:18