ASP.Net MVC Передача нескольких параметров в представление - PullRequest
9 голосов
/ 04 февраля 2010

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

Ответы [ 3 ]

6 голосов
/ 04 февраля 2010

Ваше мнение должно быть примерно таким:

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

Тогда в MyModel

Expose Свойство:

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)

В идеале все свойства, параметры или данные, которые необходимы представлению для представления себя, должны быть частью модели.

Надеюсь, это поможет.

3 голосов
/ 04 февраля 2010

Альтернативным подходом было бы использование 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}
0 голосов
/ 04 февраля 2010

Метод Пола хорош, но если вы решите, что хотите передать 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>"
...