Мое решение было базовым классом для любых моделей, используемых частичным контролем.
Это полезно в тех случаях, когда вам нужно указать модель, но вы хотите, чтобы частичное представление имело доступ к определенным вещам из содержащейся модели представления.
Примечание: это решение будет автоматически поддерживать иерархию частичных представлений.
Использование:
Когда вы вызываете 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;
}
}
}
}