gpt4 book ai didi

asp.net-mvc - mvc 操作方法中泛型类型参数的 dot net core 自定义模型绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 03:51:41 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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; }
}

最佳答案

首先创建模型绑定(bind)器,它应该实现接口(interface)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 接口(interface)的 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;
}
}

最后一件事是注册模型绑定(bind)程序提供程序,它应该在 Startup.cs 中完成

public void ConfigureServices(IServiceCollection services)
{
.
.

services.AddMvc(options=>
{
options.ModelBinderProviders.Insert(0, new SearchSortPageModelBinderProvider());
});
.
.
}

关于asp.net-mvc - mvc 操作方法中泛型类型参数的 dot net core 自定义模型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45239364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com