包含ViewPage的ViewUserControl

时间:2009-10-05 13:17:44

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

有没有办法从局部视图中获取包含parital视图的ViewPage的引用?

4 个答案:

答案 0 :(得分:0)

不是100%,但我不认为这是可能的。您希望在Partial的ViewPage中引用什么? 难道你不能只在ViewPage和ViewUserControl之间共享一个Model吗?

答案 1 :(得分:0)

似乎没有标准属性,所以你应该自己将ViewPage对象传递给局部视图:

<% Html.RenderPartial("partial_view_name", this); %>

答案 2 :(得分:0)

绝对答案:否

您需要使用ViewData或Model来共享它。

答案 3 :(得分:0)

我的解决方案是部分控件使用的任何模型的基类。 当您需要指定模型但希望局部视图可以从包含View的模型访问某些内容时,它很有用。

注意:此解决方案将自动支持部分视图的层次结构。

<强>用法:

当您调用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; }

    }

<强>基类:

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