ViewUserControl, содержащий ViewPage - PullRequest
1 голос
/ 05 октября 2009

Есть ли способ получить ссылку на ViewPage, которая содержит частичное представление из частичного представления ??

Ответы [ 4 ]

0 голосов
/ 13 октября 2009

Мое решение было базовым классом для любых моделей, используемых частичным контролем. Это полезно в тех случаях, когда вам нужно указать модель, но вы хотите, чтобы частичное представление имело доступ к определенным вещам из содержащейся модели представления.

Примечание: это решение будет автоматически поддерживать иерархию частичных представлений.

Использование:

Когда вы вызываете RenderPartial, укажите Модель (для представления). Лично я предпочитаю этот шаблон, который заключается в создании представления на месте, состоящего из того, что может потребоваться для внутреннего представления родительской модели.

Я создаю ProductListModel из текущей модели, что делает родительскую модель легко доступной для частичного представления.

  <% Html.RenderPartial("ProductList", new ProductListModel(Model) 
                       { Products = Model.FilterProducts(category) }); %> 

В самом частичном контроле вы указываете ProductListModel как строго типизированное представление.

<%@ Control Language="C#" CodeBehind="ProductList.ascx.cs"
    Inherits="System.Web.Mvc.ViewUserControl<ProductListModel>" %>

Модель класса для частичного просмотра

Примечание: я использую IShoppingCartModel, чтобы указать модель, чтобы избежать связывания частичного спина с содержащим представлением.

public class ProductListModel : ShoppingCartUserControlModel
    {
        public ProductListModel(IShoppingCartModel parentModel)
            : base(parentModel)
        {

        }

        // model data 
        public IEnumerable<Product> Products { get; set; }

    }

BASECLASSES:

namespace RR_MVC.Models
{
    /// <summary>
    /// Generic model for user controls that exposes 'ParentModel' to the model of the ViewUserControl
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ViewUserControlModel<T>
    {
        public ViewUserControlModel(T parentModel)
            : base()
        {
            ParentModel = parentModel;
        }

        /// <summary>
        /// Reference to parent model
        /// </summary>
        public T ParentModel { get; private set; }
    }

    /// <summary>
    /// Specific model for a ViewUserControl used in the 'store' area of the MVC project
    /// Exposes a 'ShoppingCart' property to the user control that is controlled by the 
    /// parent view's model
    /// </summary>
    public class ShoppingCartUserControlModel : ViewUserControlModel<IShoppingCartModel>
    {
        public ShoppingCartUserControlModel(IShoppingCartModel parentModel) : base(parentModel)
        {

        }

        /// <shes reummary>
        /// Get shopping cart from parent page model.
        /// This is a convenience helper property which justifies the creation of this class!
        /// </summary>
        public ShoppingCart ShoppingCart
        {
            get
            {
                return ParentModel.ShoppingCart;
            }
        }
    }
}
0 голосов
/ 07 октября 2009

Кажется, что для этого нет стандартного свойства, поэтому вы должны передать объект ViewPage для частичного просмотра:

<% Html.RenderPartial("partial_view_name", this); %>
0 голосов
/ 07 октября 2009

Абсолютный ответ: НЕТ

Вам необходимо использовать ViewData или Model, чтобы поделиться ими.

0 голосов
/ 06 октября 2009

Не 100%, но я не думаю, что это возможно. На что конкретно вы хотите сослаться в ViewPage из Частичного? Не могли бы вы просто поделиться моделью между ViewPage и ViewUserControl?

...