首页 > 解决方案 > 在视图中使用泛型类 T

问题描述

我为任何使用分页的视图模型设置了一个模式,以及将在整个站点中使用的单个视图。

所以给定这个界面:

public interface IPaginationModel<T> where T : class
{
    IPagedList<T> PagedCollection { get; set; }

    int ItemsPerPage { get; set; }

    int PageIndex { get; set; }

    int TotalPages { get; set; }
}

而这个模型

    public class CollectionsViewModel : IPaginationModel<CollectionModel>
{
    public IEnumerable<CollectionModel> Collections { get; set; }

    public IPagedList<CollectionModel> PagedCollection { get; set; }

    public int ItemsPerPage { get; set; }

    public int PageIndex { get; set; }

    public int TotalPages { get; set; }

    public CollectionsViewModel()
    {
       
    }
}

我想以这样的方式使用 view/.cshtml ......

@model Solnet.TeddyPicker.Generator.Models.Pagination.IPaginationModel<T>

@Html.PagedListPager(Model.PagedCollection, page => Url.Action("Index", new { pagesize = Model.ItemsPerPage, page = Model.PageIndex }),
                new X.PagedList.Web.Common.PagedListRenderOptions()
                {
                    LiElementClasses = new string[] { "page-item" },
                    PageClasses = new string[] { "page-link" },
                    Display = X.PagedList.Web.Common.PagedListDisplayMode.Always
                })

但它不喜欢'T',找不到命名空间。那么有没有办法让视图接受这种泛型类型?

标签: asp.net-mvcasp.net-coregenericspagedlist

解决方案


关键是使用泛型是没有意义的……如果你使用泛型,很多操作都将被禁止。您将无法使用使用 lambda 的助手

TextBoxFor 等表达式。

当您需要执行与多种类型一起使用的视图时,正确的方法是使用动态变量,因此您应该执行以下操作:

@model MyList<dynamic>

如果你这样做,你将被允许在你的列表上做任何操作,因为实际的语法检查将在运行时完成......但是这个解决方案也有缺点:

  1. 您可以在您的助手或包含动态的类型上调用任何方法,但由于 VisualStudio 不知道实际类型,因此没有可用的 Intellisense。

  2. 不能使用扩展类型,这意味着你不能调用 Html.TextBox(......但是你必须调用定义扩展方法的实际静态方法......比如

这个: InputExtensions.TextBox(Html,....


推荐阅读