【问题标题】:ASP.Net MVC Passing multiple parameters to a viewASP.Net MVC 将多个参数传递给视图
【发布时间】:2011-01-13 01:19:12
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc views partial-views


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      这使网址反映了您在屏幕上看到的内容,并使设计更具可扩展性;如果您将来需要添加数据的其他视图(摘要、最新等),您可以添加新视图,不需要部分视图,除非视图的主体变得更加复杂并且必须分解为部分视图.

      网址如下所示:

      ~/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}
      

      【讨论】:

        【解决方案3】:

        你的视图应该是这样的:

        <%@ 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)
        

        理想情况下,View 呈现自身所需的所有属性、参数或数据都应该是 Model 的一部分。

        希望对你有帮助。

        【讨论】:

        • 另外 ProductList 也将成为 MyModel 的一部分。
        • 嗨 Nitin,我开始关注你的回答,我创建了 ViewModel 使用方法 public ProductsViewModel(bool renderDetailView, List productsList){this.RenderDetailView = renderDetailView;this.ProductsList = productsList ;} 并通过 return View("Products", new ProductsViewModel(true, products)); 将其传递给 Products 页面但由于某种原因, if Model.RenderDetailView 线从未被击中 - 页面的所有其余部分都被呈现,但 中的任何代码都没有被击中。 Aso 我可以逐步查看并查看正在填充的 ProductsViewModel。有什么建议吗?
        • 感谢您的回复!同时,我删除并重新创建了视图,并将视图模型代码更改为可空类型为 public bool?渲染细节视图 { 获取;私人套装; } 现在它工作了!我也喜欢保罗的方式,但我认为你的方式在这个场景中最有意义。你怎么看?
        • 理想情况下你的代码应该是这样的:你有一个页面让我们说产品页面。因为您有两个以控件形式存在的局部视图,由相同的模型和控制器驱动。然后在操作上使用任一控件的部分渲染。通过使用 Paul 方式,您必须重写两种视图共有的功能,我个人不喜欢。
        • 是的,我想这取决于您对部分视图的用途的解释。无论如何,我更喜欢你的方式。
        猜你喜欢
        • 2011-06-16
        • 1970-01-01
        • 2018-12-08
        • 2011-07-26
        • 2011-09-26
        • 2015-10-02
        • 2013-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多