2010-02-04 8 views
9

Dans ASP.Net MVC, je souhaite afficher une vue partielle différente en fonction du paramètre chaîne de requête rendu.ASP.Net MVC Passage de plusieurs paramètres à une vue

Par conséquent fournissant la possibilité pour l'utilisateur de choisir de voir les produits par vignette ou par des détails. J'ai accès au paramètre choisi dans le contrôleur mais je ne sais pas comment ou, si je devrais passer cela à la vue avec la liste des produits afin que la vue puisse implémenter la logique pour décider quelle vue partielle à afficher?

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> 

Répondre

6

Votre vue doit être quelque chose comme:

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

Puis, en MyModel

Expose Propriété:

public bool RenderDetailView {get;set;} 

Dans votre action du contrôleur:

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

Alors à votre avis, libeller le chèque comme:

<% if (Model.RenderDetailView) 

Idéalement, toutes les propriétés ou les paramètres ou des données d'un point de vue doit afin de présenter lui-même devrait faire partie du modèle.

J'espère que ça aide.

+0

Alsó ProductList sera également la partie de MyModel. –

+0

Salut Nitin, j'ai commencé à suivre votre réponse et j'ai créé le ViewModel en utilisant la méthode public ProductsViewModel (bool renderDetailView, Liste productsList) {this.RenderDetailView = renderDetailView; this.ProductsList = productsList;} et passez-le à la page Products avec retour View ("Produits", nouveau ProductsViewModel (true, produits)); mais pour une raison quelconque, la ligne if Model.RenderDetailView n'est jamais atteinte - tout le reste de la page est rendu mais aucun code au sein de <% %> n'est touché. Aso je peux passer à travers et voir le ProductsViewModel étant rempli. Aucune suggestion? –

+0

Pouvez-vous s'il vous plaît montrer votre vue et le code du contrôleur? –

3

Une approche alternative consisterait à utiliser Restful Urls pour appeler l'action et la vue du contrôleur appropriées.

Ceci fait que les URLs reflètent ce que vous voyez sur l'écran et rendent le design plus extensible; Si vous avez besoin d'ajouter d'autres vues des données dans le futur (résumé, dernier, etc.), vous ajoutez la nouvelle vue, pas besoin de partiels sauf si le corps principal de la vue devient plus compliqué et doit être factorisé sur une vue partielle .

Les URL ressembleraient:

~/product/1/detail 

~/product/1/thumbnail 

et correspondent aux méthodes 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); 
} 

Vous activez le routage avec un itinéraire comme:

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

méthode de Paul est bon , mais si vous décidez que vous voulez passer l'int, vous devez créer un modèle de vue.

Dans votre contrôleur ajouter cette

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

passent ensuite ceci dans la vue

return View(new ProductsFormViewModel(products, renderview); 

Et puis dans la vue

Inherits="System.Web.Mvc.ViewPage<YourNamespace.Controllers.ProductsFormViewModel>" 
Questions connexes