【问题标题】:Using Generics Class T in View在视图中使用泛型类 T
【发布时间】:2021-10-05 19:29:11
【问题描述】:

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

所以给定这个界面:

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()
    {
       
    }
}

我想以这样的方式使用视图/.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-mvc asp.net-core generics pagedlist


    【解决方案1】:

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

    TextBoxFor 等表达式。

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

    @model MyList<dynamic>
    

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

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

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

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

    【讨论】:

    • 我不会调用任何动作,除了分页控件,其属性在界面中定义。这纯粹是一个分页视图。没有其他控制或目的。
    • 如果你只是做分页,可以看这篇文章,可能对你有帮助:docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/…aspnetcore-5.0
    • 我正在使用 IPagedList,它是最流行的 asp.net 分页包。分页不是问题——它在视图中将类型传递给 IPagedList。我可能会更新问题,因为它可能不清楚
    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多