2010-02-04 59 views
9

在ASP.Net MVC中,我想根據renderview查詢字符串參數呈現不同的局部視圖。ASP.Net MVC將多個參數傳遞給視圖

因此爲用戶提供設施供用戶選擇按縮略圖或細節查看產品。

我有權訪問控制器中的所選參數,但我不知道如何或者如果我應該將此視圖與產品列表一起傳遞給視圖,以便視圖可以實現邏輯以決定將哪個局部視圖顯示?

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> 

回答

6

您認爲應該是這樣的:

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

然後基於myModel

揭露房產:

public bool RenderDetailView {get;set;} 

在你的控制器動作:

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

然後在您的視圖中,檢查,如:

<% if (Model.RenderDetailView) 

理想的情況下,所有這些視圖需要爲了呈現本身應該是模型的一部分的屬性或參數或數據。

我希望它能幫助。

+0

也是產品列表也將是爲MyModel的一部分。 – 2010-02-04 12:17:53

+0

嗨尼廷,我開始按照你的答案,我創建了ViewModel方法public ProductsViewModel(bool renderDetailView,列表 productsList){this.RenderDetailView = renderDetailView; this.ProductsList = productsList;}並將其傳遞到Products頁面與返回查看(「產品」,新ProductsViewModel(true,產品));但由於某種原因,如果Model.RenderDetailView行從未被擊中 - 頁面的所有其餘部分都被渲染,但<% %>內的任何代碼都未被擊中。阿蘇我可以通過並看到正在填充ProductsViewModel。有什麼建議麼? – 2010-02-04 13:36:04

+0

你可以請你展示你的視圖和控制器代碼嗎? – 2010-02-04 15:02:03

3

另一種方法是使用Restful Url來調用適當的控制器動作和視圖。

這使得網址反映了您在屏幕上看到的內容,並使設計更具可擴展性;如果您需要在未來添加其他數據視圖(摘要,最新等),則添加新視圖,不需要部分視圖,除非視圖的主體變得更加複雜,並且必須將其分解爲局部視圖。

中的URL看起來像:

~/product/1/detail 

~/product/1/thumbnail 

,並對應於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); 
} 

您能夠與像一個路由的路由:

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

保羅是一個好方法,但如果您決定要傳遞int,則需要創建視圖模型。

在您的控制器添加此

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

那麼這個傳遞到視圖

return View(new ProductsFormViewModel(products, renderview); 

然後在視圖

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