2010-02-04 22 views
9

En ASP.Net MVC Me gustaría mostrar una vista parcial diferente según el parámetro de cadena de consulta renderview.ASP.Net MVC Pasar parámetros múltiples a una vista

Por lo tanto, brinda la posibilidad al usuario de elegir ver los productos por miniatura o por detalles.

Tengo acceso al parámetro elegido en el controlador pero no sé cómo hacerlo o si debería pasar esto a la vista junto con la lista de productos para que la vista pueda implementar la lógica para decidir qué vista parcial ¿monitor?

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> 

Respuesta

6

Su punto de vista debe ser algo como:

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

Luego, en MyModel

Expose propiedad:

public bool RenderDetailView {get;set;} 

En su acción de controlador:

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

Luego, en su opinión, haga el cheque como:

<% if (Model.RenderDetailView) 

Idealmente, todas las propiedades o parámetros o datos que a View necesita con el fin de presentarse a sí misma debe ser parte del modelo.

Espero que ayude.

+0

también la lista de productos también será la parte de MyModel. –

+0

Hola Nitin, comencé a seguir tu respuesta y he creado ViewModel utalizando el método público ProductsViewModel (bool renderDetailView, List productsList) {this.RenderDetailView = renderDetailView; this.ProductsList = productsList;} y lo paso a la página de Productos con Return View ("Productos", nuevos ProductsViewModel (true, productos)); pero por alguna razón, la línea si Model.RenderDetailView nunca se golpea, todo el resto de la página se procesa pero cualquier código dentro de <% %> no recibe ningún golpe. Aso puedo pasar y ver que se completa el ProductsViewModel. ¿Alguna sugerencia? –

+0

¿Puede mostrar la vista y el código del controlador? –

3

Un enfoque alternativo sería utilizar Restful Urls para invocar la acción y vista del controlador apropiado.

Esto hace que las URL reflejen lo que está viendo en la pantalla y hace que el diseño sea más extensible; si necesita agregar otras vistas de los datos en el futuro (resumen, último, etc.) agrega la nueva vista, sin necesidad de parciales, a menos que el cuerpo principal de la vista se vuelva más complicado y se tenga que factorizar en una vista parcial .

Las direcciones URL se vería así:

~/product/1/detail 

~/product/1/thumbnail 

y corresponden a métodos 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); 
} 

Habilitar la ruta con una ruta como:

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

el método de Pablo es bueno , pero si decide que quiere pasar el int, necesita crear un modelo de vista.

En su controlador añadir esta

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

A continuación, pasar esto en la vista

return View(new ProductsFormViewModel(products, renderview); 

Y luego en la vista

Inherits="System.Web.Mvc.ViewPage<YourNamespace.Controllers.ProductsFormViewModel>" 
Cuestiones relacionadas