Comment remplir MVC razor vue partielle

Je dois créer une vue qui affiche les informations D'en-tête de commande et j'ai besoin d'ajouter une vue patiale qui affiche une grille d'éléments de ligne. La vue partielle sera fortement typée à partir d'un viewmodel. Je comprends que je devrais utiliser l'aide html @Html.Partielle ("chemin / vue"). Je n'ai utilisé que des contrôleurs jusqu'à maintenant pour ouvrir une vue, en remplissant le viewmodel avant de l'Envoyer à la vue. Puisque la vue partielle est appelée form the html helper, je voudrais savoir quel serait le meilleur moyen pour remplir la vue parital avec les données du modèle.

24
demandé sur Alan Fisher 2012-12-07 23:25:20

2 réponses

Option 1: Hériter de la page parent

Par défaut, Toute vue partielle rendue en appelant @Html.Partial("PartialViewName") obtiendra le modèle de vue transmis à la vue parent.

Donc, si vous avez:

Voir Le Modèle

namespace MyNamesapce
{
    public OrderInfoViewModel
    {
        public string OrderTitle { get; set; }
        public IEnumerable<OrderItem> OrderItems { get; set; }
    }
}

OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel

<h1>@Model.OrderTitle</h1>

@Html.Partial("OrderLineItems")

La page OrderLineItems doit recevoir un MyNamespace.OrderViewModel qui lui est transmis... si votre vue partielle devrait ressembler à ceci:

OrderLineItems.cshtml

@model MyNamespace.OrderInfoViewModel

foreach (var orderItem in Model.OrderItems)
{
    //Do stuff
}

Option 2: Spécifiez le modèle

Vous pouvez utiliser le deuxième paramètre pour spécifier le modèle de vue à transmettre. C'est à dire

OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel

<h1>@Model.OrderTitle</h1>

@Html.Partial("OrderLineItems", Model.OrderItems)

OrderLineItems.cshtml

@model IEnumerable<OrderItem>

foreach (var orderItem in Model)
{
    //Do stuff
}

Option 3: Utiliser des actions partielles

Si vous avez besoin de réutiliser une vue partielle sur plusieurs pages, il pourrait être judicieux d'utiliser une vue partielle pour éviter d'avoir à remplir différents modèles de vue avec les mêmes informations simplement parce que la page va être en utilisant le même partiel.

Par exemple

Voir Le Modèle

namespace MyNamesapce
{
    public OrderInfoViewModel
    {
        public string OrderTitle { get; set; }
    }
}

Contrôleur de

public class OrderController : Controller
{
    public ActionResult OrderInfo(int orderId)
    {
        OrderInfoViewModel viewModel = GetViewModel(orderId);
        return View(viewModel);
    }

    public PartialViewResult OrderLineItems(int orderId)
    {
        IEnumerable<OrderItem> orderItems = GetOrderItems(orderId);
        return Partial(orderItems);
    }
}

OrderInfo.cshtml

@model MyNamespace.OrderInfoViewModel

<h1>@Model.OrderTitle</h1>

@Html.Action("OrderLineItems")

OrderLineItems.cshtml

@model IEnumerable<OrderItem>

foreach (var orderItem in Model.OrderItems)
{
    //Do stuff
}
45
répondu Charlino 2012-12-07 19:52:27

Avec une vue partielle, vous envoyez simplement un modèle comme vous le feriez avec une vue normale. Par exemple, si votre modèle a une propriété D'objets LineItem nommés 'LineItems', vous feriez simplement ceci:

@Html.Partial("_PartialName", Model.LineItems)

Maintenant, si votre modèle n'a pas cette propriété, vous pouvez soit l'ajouter, soit le passer d'une autre manière, comme ViewBag (je préfère une méthode fortement typée, mais c'est mon opnion:

@Html.Partial("_PartialName", (List<LineItem>)ViewBag.LineItems)

Ce ne sont pas les seuls moyens, mais ce sont mes méthodes préférées.

5
répondu naspinski 2012-12-07 19:28:40