mvc 操作方法中泛型类型参数的 dot net core 自定义模型绑定

2023-12-02

我正在构建一个简单的搜索、排序、页面功能。我附上了下面的代码。 以下是用例:

  1. 我的目标是通过每个请求传递“当前过滤器”以保留它们,特别是在排序和分页时。

  2. 我不想用许多(如果不是太多)参数污染我的操作方法,而是考虑使用保存当前过滤器的通用类型参数。

  3. 我需要一个能够实现此目的的自定义模型绑定器。

有人可以发布一个示例实现吗?

PS:我也在探索替代方案,而不是来回传递复杂的对象。但我需要将此路线作为最后的手段,并且我找不到自定义模型绑定泛型类型参数的好示例。任何指向此类示例的指针也会有所帮助。谢谢!。

public async Task<IActionResult> Index(SearchSortPage<ProductSearchParamsVm> currentFilters, string sortField, int? page)
{
    var currentSort = currentFilters.Sort;
    // pass the current sort and sortField to determine the new sort & direction
    currentFilters.Sort = SortUtility.DetermineSortAndDirection(sortField, currentSort);
    currentFilters.Page = page ?? 1;

    ViewData["CurrentFilters"] = currentFilters;

    var bm = await ProductsProcessor.GetPaginatedAsync(currentFilters);

    var vm = AutoMapper.Map<PaginatedResult<ProductBm>, PaginatedResult<ProductVm>>(bm);

    return View(vm);
}

public class SearchSortPage<T> where T : class
{
    public T Search { get; set; }
    public Sort Sort { get; set; }
    public Nullable<int> Page { get; set; }
}

public class Sort
{
    public string Field { get; set; }
    public string Direction { get; set; }
}

public class ProductSearchParamsVm
{
    public string ProductTitle { get; set; }
    public string ProductCategory { get; set; }
    public Nullable<DateTime> DateSent { get; set; }
}

首先创建模型绑定器,它应该实现接口 IModelBinder

SearchSortPageModelBinder.cs

public class SearchSortPageModelBinder<T> : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }   

        SearchSortPage<T> ssp = new SearchSortPage<T>();

        //TODO: Setup the SearchSortPage<T> model 

        bindingContext.Result = ModelBindingResult.Success(ssp);

        return TaskCache.CompletedTask;
    }
}

然后创建应该实现 IModelBinderProvider 接口的 Model Binder Provider

SearchSortPageModelBinderProvider.cs

public class SearchSortPageModelBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        if (context.Metadata.ModelType.GetTypeInfo().IsGenericType && 
            context.Metadata.ModelType.GetGenericTypeDefinition() == typeof(SearchSortPage<>))
        {
            Type[] types = context.Metadata.ModelType.GetGenericArguments();
            Type o = typeof(SearchSortPageModelBinder<>).MakeGenericType(types);

            return (IModelBinder)Activator.CreateInstance(o);
        }

        return null;
    }
}

最后一件事是注册 Model Binder Provider,它应该在 Startup.cs 中完成

public void ConfigureServices(IServiceCollection services)
{
        .
        .

        services.AddMvc(options=>
        {
            options.ModelBinderProviders.Insert(0, new SearchSortPageModelBinderProvider());
        });
        .
        .
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mvc 操作方法中泛型类型参数的 dot net core 自定义模型绑定 的相关文章

随机推荐

  • 从 Parse 查询 GeoPoint 并将其作为 MKAnnotation 添加到 MapKit?

    我正在尝试查询存储在 Parse 后端的 PFGeoPoints 数组 我在 Parse 中有一个名为 Post 的 PFObject 并为其分配了 位置 标题 消息 等数据 从我的应用程序发布后 所有内容都会发送到 Parse 并正确存储
  • playframework中的多个文件上传

    我在上传多个文件时遇到一些问题 当我选择x个文件时 它成功通过 但第一个文件正在上传x次 而其他文件根本没有上传 有人能指出我做错了什么吗 Form form Projects uploadPictures project id encty
  • 从 HTML 表中检索过滤后的数据并将其格式化为数组

    我一直在 PHP 系统中开发一个函数 我可以在其中过滤记录 然后将其导出到具有使用 PHPSpreadSheet 模板的 Excel 我的问题是我不知道如何检索上面标题中所述的过滤记录 我想我的代码中遗漏了一些东西 这是我将记录从数据库提取
  • 使用 R 中的 3d Delaunay 三角面板绘制球体表面

    EDIT 更通用的解决方案可以在答案中看到这个问题 我想知道是否有人可以帮助我使用 XYZ 坐标绘制球体表面的近似值 我尝试使用该包计算 Delaunay 三角面板geometry然后用rgl 第一次尝试看起来不错 但不幸的是创建了穿过球体
  • 通过ajax和php动态更新页面

    我想通过ajax将数据提交到数据库 并将数据插入数据库后 该数据应该显示在文件上演示 html最后动态地 即在我的例子中的 div 之后 我已经通过ajax存储数据了 但我不知道如何显示这个新插入的数据演示 html 所以请指导我如何实现这
  • 让长字符串换行的好方法?

    在我的项目中 我有一堆从文件中读取的字符串 其中大多数在命令控制台中打印时 长度超过 80 个字符并且环绕 看起来很难看 我希望能够让 Python 读取该字符串 然后测试它的长度是否超过 75 个字符 如果是 则将字符串拆分为多个字符串
  • 在所有服务器上删除触发器

    我有一个触发器来阻止某人使用 Management Studio CREATE TRIGGER TR LOGON APP ON ALL SERVER FOR LOGON AS BEGIN DECLARE program name NVARC
  • 无法将 list 传输到 Web 服务?

    我的服务器和网络服务上有相同的类 我有以下 WebMethod WebMethod public int CreateOrder List
  • 使用VBA完全控制另一个程序

    我目前正在致力于简化工作流程 它涉及使用串行连接传输数据的 Chatillon DFIS 测力计 数据以文本形式发送到 Chattillon 程序 并且只能保存为 dat 文件 我正在尝试设置一个 Excel 工作簿 它可以自动打开程序并使
  • 当 mobx 存储中的状态发生变化时,Ant-Design Table 不会渲染

    我对 ant design Table 组件中单击一行的行为进行了编程 这应该更改表上的 rowClassName 这是 CodeSandBox 上的示例 当您单击表行时 Store selectedRowKey 中的值会发生变化 但表不会
  • Tika Parser:排除 PDF 附件

    有一个 PDF 文档 其中包含 Tika 不应提取的附件 此处为 joboptions 内容不应发送到 Solr 有没有办法在 Tika 配置中排除某些 或全部 PDF 附件 gagravarr 我们通过以下方式改变了这种行为蒂卡 2096
  • 在 Excel (DAX) 中查找相对于当前行值的行

    有没有办法使用 DAX 根据当前行的值过滤行 我正在使用 power hub 换句话说 如果我有一个表 进度 其中 ID 在每行中递增 并且有一个 百分比 列和另一个包含 我想创建一个名为旧百分比 progress ID 1 百分比的列 这
  • 了解 SQL 中的笛卡尔积

    我无法理解笛卡尔积如何工作 考虑简单的模式 mysql gt select from account account number branch name balance A101 Downtown 500 A102 Perryridge
  • 将多个 yuv 帧转换为一个 yuv 帧

    我有一些 yuv 格式的图像 它们都是我捕获的一个序列的一部分 现在我想通过将它们转换为 mpg4 文件来制作视频 但在此之前 我需要以某种方式从我拥有的所有 yuv 帧中制作一个 yuv 文件 我听说这是可能的 但在互联网上找不到任何东西
  • UIWebView 不会加载带有证书的链接(https:// 前缀)

    我知道以前曾有人问过这个问题 但我已经查看了每个答案 数量不多 但没有一个对我有帮助 我遇到的问题是使用学校电子邮件服务处理证书 这两个电子邮件服务的链接如下 主要学校电子邮箱 https marauder millersville edu
  • 如何用计数和百分比注释水平条形图

    如何获得每个条形右侧的计数和百分比 目前我只知道如何获得计数 import pandas as pd import matplotlib pyplot as plt age 0 17 18 60 61 80 df3 pd DataFrame
  • 正则表达式将 相对 URL 更改为绝对 URL

    我需要查看 HTML 字符串并更改所有内容 img 标签 其中src属性是绝对 URL 的相对地址 所以这 img src puppies jpg 需要成为 img src http sitename com path puppies jp
  • 使用elasticsearch_dsl获取所有行

    目前我正在使用以下程序从弹性搜索中提取 id 及其严重性信息 from elasticsearch import Elasticsearch from elasticsearch dsl import Search Q client Ela
  • Gulps gulp.watch 未针对新文件或已删除文件触发?

    在 glob 匹配中编辑文件时 以下 Gulpjs 任务运行良好 watch task gulp task watch build function gulp watch src js js scripts gulp watch src i
  • mvc 操作方法中泛型类型参数的 dot net core 自定义模型绑定

    我正在构建一个简单的搜索 排序 页面功能 我附上了下面的代码 以下是用例 我的目标是通过每个请求传递 当前过滤器 以保留它们 特别是在排序和分页时 我不想用许多 如果不是太多 参数污染我的操作方法 而是考虑使用保存当前过滤器的通用类型参数