10

在 ASP.Net MVC 中,我想根据 renderview 查询字符串参数呈现不同的局部视图。

因此,为用户提供了选择通过缩略图或详细信息查看产品的便利。

我可以访问控制器中选择的参数,但我不知道如何,或者,如果我应该将它与产品列表一起传递给视图,以便视图可以实现决定显示哪个部分视图的逻辑?

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>
4

3 回答 3

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)

理想情况下,视图为了呈现自身所需的所有属性、参数或数据都应该是模型的一部分。

我希望它有所帮助。

于 2010-02-04T12:16:37.900 回答
3

另一种方法是使用 Restful Urls 来调用适当的控制器操作和视图。

这使 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}
于 2010-02-04T12:56:12.463 回答
0

Paul 的方法很好,但是如果您决定要传递 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>"
于 2010-02-04T13:11:27.370 回答