asp.net-mvc - 在视图中使用泛型类 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',找不到命名空间。那么有没有办法让视图接受这种泛型类型?
解决方案
关键是使用泛型是没有意义的……如果你使用泛型,很多操作都将被禁止。您将无法使用使用 lambda 的助手
TextBoxFor 等表达式。
当您需要执行与多种类型一起使用的视图时,正确的方法是使用动态变量,因此您应该执行以下操作:
@model MyList<dynamic>
如果你这样做,你将被允许在你的列表上做任何操作,因为实际的语法检查将在运行时完成......但是这个解决方案也有缺点:
您可以在您的助手或包含动态的类型上调用任何方法,但由于 VisualStudio 不知道实际类型,因此没有可用的 Intellisense。
不能使用扩展类型,这意味着你不能调用 Html.TextBox(......但是你必须调用定义扩展方法的实际静态方法......比如
这个: InputExtensions.TextBox(Html,....
推荐阅读
- c# - C# 中的客户端套接字
- css - 触摸输入字段在 iOS Safari 上停止滚动
- docker - 有没有办法在 github 操作上运行 Web 应用程序
- java - 手动删除 TreeMap 嵌套的空值
- c++ - slarch.c:(.text+0x2a3): 链接 Oracle 19c 库时在 Redhat Linux 7 中未定义对“__intel_cpu_feature_indicator_x”的引用
- centos8 - 是否可以通过 PXE 部署完全配置的 CentOS 8 安装?非交互式
- python - 如何修复:TypeError:/: 'str' 和 'float' 不支持的操作数类型
- python - 释放python中所有使用的内存
- pega - Pega Systems 添加线路连接
- vue.js - Vue-Apexchart:条形图,如何使最高列全高