2010-02-04 17 views
9

W ASP.Net MVC chciałbym renderować inny widok częściowy w zależności od parametru ciągu zapytania renderview.ASP.Net MVC Przekazywanie wielu parametrów do widoku

Dlatego zapewnia się użytkownikowi możliwość wyboru wyświetlania produktów według miniatur lub szczegółowych informacji.

Mam dostęp do wybranego parametru w kontrolerze, ale nie wiem jak lub, jeśli powinienem przekazać to do widoku wraz z listą produktów, aby widok mógł zaimplementować logikę do decydowania, który widok częściowy pokaz?

public ActionResult Products(string id, int? renderview) 
{ 
    var products = productRepository.GetProducts(id).ToList(); 
    return View("Products", products); 
} 



<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MLBWebRole.Models.Product>>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Products 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

<h2>Products</h2> 

<p>This is the Products page</p> 

<p><a href="?renderview=0">thumbnails</a>&nbsp;<a href="?renderview=1">details</a></p> 


<% if (renderview == 1) 
    {%> 
    <% Html.RenderPartial("ProductsDetailList"); %> 
<% } 
else 
{ %> 
<% Html.RenderPartial("ProductsThumbnailList"); %> 
    <% } %> 

</asp:Content> 

Odpowiedz

6

Państwa zdaniem powinno być coś jak:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Models.MyModel>" %> 

potem w MyModel

Expose nieruchomości:

public bool RenderDetailView {get;set;} 

W Twojej działania kontrolera:

public ActionResult Products(string id, int? renderview) 
{ 
    var products = productRepository.GetProducts(id).ToList(); 
    return View("Products", new MyModel {RenderDetailView = renderview.HasValue}); 
} 

Następnie w widoku, make sprawdzić jak:

<% if (Model.RenderDetailView) 

Idealnie wszystkich właściwości lub parametrów lub danych których Zobacz potrzebuje w celu zaprezentowania siebie powinny być częścią modelu.

Mam nadzieję, że to pomaga.

+0

również ProductList będzie również częścią MyModel. –

+0

Cześć Nitin, zacząłem podążać za twoją odpowiedzią i utworzyłem ViewModel utalising the method public ProductsViewModel (bool renderDetailView, List productList) {this.RenderDetailView = renderDetailView; this.ProductsList = productsList;} i przekazanie go do strony Produkty z widokiem Return ("Produkty", nowe produktyViewView (true, produkty)); ale z jakiegoś powodu linia Model.RenderDetailView nigdy nie zostanie trafiona - cała reszta strony zostanie wyrenderowana, ale żaden kod w ciągu <% %> nie zostanie trafiony. Aso mogę przejść i zobaczyć zapełniony ProductViewModel. Jakieś sugestie? –

+0

Czy możesz pokazać swój widok i kod kontrolera? –

3

Alternatywnym rozwiązaniem byłoby użycie Restful Urls w celu wywołania odpowiedniej akcji kontrolera i wyświetlenia.

To sprawia, że ​​adresy URL odzwierciedlają to, co widzisz na ekranie i czynią projekt bardziej rozszerzalnym; jeśli musisz dodać inne widoki danych w przyszłości (podsumowanie, najnowsze, itp.), dodaj nowy widok, bez potrzeby częściowego, chyba że główny element widoku staje się bardziej skomplikowany i musi być uwzględniony w częściowym widoku .

Adresy URL będzie wyglądać następująco:

~/product/1/detail 

~/product/1/thumbnail 

i odpowiadają metod ProductController:

public ActionResult Detail(String id) 
{ 
    var products = productRepository.GetProducts(id).ToList(); 
    return View("Detail", products); 
} 

public ActionResult Thumbnail(string id) 
{ 
    var products = productRepository.GetProducts(id).ToList(); 
    return View("Thumbnail", products); 
} 

włączyć routing z trasy jak:

{controller}/{id}/{action} 
0

metoda Pawła jest dobry , ale jeśli zdecydujesz, że chcesz przekazać int, musisz utworzyć model widoku.

W kontrolerze dodać ten

public class ProductsFormViewModel 
    { 
     // Properties 
     public Products Products { get; private set; } 
     public int? Renderview { get; private set; } 

     // Constructor 
     public ProductsFormViewModel(Products p_products, int? p_renderView) 
     { 
      Products = p_products; 
      Renderview = renderView; 
     } 
    } 

Następnie przekazać to do widzenia

return View(new ProductsFormViewModel(products, renderview); 

a następnie w widoku

Inherits="System.Web.Mvc.ViewPage<YourNamespace.Controllers.ProductsFormViewModel>" 
Powiązane problemy