2012-12-07 20 views
21

Potrzebuję utworzyć widok wyświetlający informacje o nagłówku zamówienia i muszę dodać widok patialny, który wyświetla siatkę elementów zamówienia. Widok częściowy zostanie silnie wpisany z modelu widoku. Rozumiem, że powinienem używać html helper @ Html.Partial ("Path/view"). Do tej pory korzystałem tylko z kontrolerów, aby otworzyć widok, zapełniając model podglądu przed wysłaniem go do widoku. Ponieważ widok częściowy jest wywoływany z pomocnika html, chciałbym wiedzieć, jaki byłby najlepszy sposób wypełnienia widoku parytetu danymi modelu.Sposób wypełniania częściowego widoku maszynki do golenia maszynowego

Odpowiedz

40

Wariant 1:. Przejmij ze strony nadrzędnej

Domyślnie każdy widok częściowy wygenerowany przez wywołanie @Html.Partial("PartialViewName") spowoduje przekazanie modelu widoku do widoku nadrzędnego.

Więc jeśli masz:

Widok Model

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") 

Strona OrderLineItems powinien dostać MyNamespace.OrderViewModel przeszedł więc do niego ... Twój częściowy widok powinien wyglądać tak:

OrderLineItems.cshtml

@model MyNamespace.OrderInfoViewModel 

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

Opcja 2: Określanie modelu

Można użyć drugiego parametru, aby określić widok modelu mają być przekazane. To znaczy.

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 
} 

Wariant 3: Stosować działania cząstkowe

Jeśli trzeba ponownie użyć częściowy widok na wielokrotność strony, może to być dobre pomysł wykorzystania częściowego widoku do wyeliminowania konieczności wypełniania różnych modeli widoku tymi samymi informacjami, tylko dlatego, że strona będzie korzystała z tego samego częściowego widoku.

E.g.

Widok Model

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

Controller

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 
} 
+0

Jaki jest scenariusz, w którym opcja 3 byłyby korzystniejsze niż 2? Czy nie mógłbym po prostu wywołać częściowego widoku wielokrotnie i nadal być SUCHĄ? – NickSuperb

+0

Korzystając z opcji 1 i 2, należy uzupełnić model widoku strony głównej o wszystkie dane potrzebne do wyświetlenia częściowego. Scenariusz w tym pytaniu/odpowiedzi nie jest najlepszy, powiedzmy, że masz widżet podsumowujący koszyk, który jest wyświetlany na wielu stronach ... łatwiej byłoby skorzystać z opcji nr 3. W przeciwnym razie każda akcja wyświetlająca również widżet koszyka na zakupy (większość stron) byłaby odpowiedzialna za wypełnienie jego modelu widoku danymi, których potrzebuje widżet koszyka na zakupy. – Charlino

+0

Dobrze, teraz zdaję sobie sprawę, że musiałbyś nieustannie kierować model do częściowego widoku pośrednio, a nie bezpośrednio. – NickSuperb

4

Po częściowym wyświetleniu wysyłamy model, tak jak w normalnym widoku. Na przykład, jeśli twój model ma właściwość obiektów elementu zamówienia o nazwie „LineItems” po prostu byłoby to zrobić:

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

Teraz, jeśli dany model nie posiada tej własności, można też dodawać je lub przekazać je w inny sposób jak ViewBag (wolę silnie typami metoda, ale to moim opinię:

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

nie są to jedyne sposoby, ale są moje korzystne sposoby

Powiązane problemy