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.
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
}
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.