C# ASP.NET核心MVC默认模型值
在我的应用程序中,我使用CQRS方法。对于一些查询,我编写了IPagedRequest:C# ASP.NET核心MVC默认模型值,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,在我的应用程序中,我使用CQRS方法。对于一些查询,我编写了IPagedRequest: public interface IPagedRequest<out TResponse>: IRequest<TResponse> { int Page { get; set; } int PageSize { get; set; } } 公共接口IPagedRequest:IRequest{ int页{get;set;} int PageSize{get;
public interface IPagedRequest<out TResponse>: IRequest<TResponse> {
int Page { get; set; }
int PageSize { get; set; }
}
公共接口IPagedRequest:IRequest{
int页{get;set;}
int PageSize{get;set;}
}
我的问题是:如何全局设置页面和页面大小属性的默认值?我尝试使用IModelBinder,但我的代码不起作用:
public class PagedRequestBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
return typeof(IPagedRequest<object>).IsAssignableFrom(context.Metadata.ModelType)
? new PagedRequestBinder()
: null;
}
}
public class PagedRequestBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var pagedList = (IPagedRequest<object>) bindingContext.Model;
if (pagedList.Page == 0) pagedList.Page = 1;
if (pagedList.PageSize == 0) pagedList.PageSize = 25;
bindingContext.Result = ModelBindingResult.Success(pagedList);
return Task.CompletedTask;
}
}
公共类PagedRequestBinderProvider:IModelBinderProvider
{
公共IModelBinder GetBinder(ModelBinderProviderContext)
{
if(上下文==null)
{
抛出新ArgumentNullException(nameof(context));
}
返回typeof(IPagedRequest).IsAssignableFrom(context.Metadata.ModelType)
?新的PagedRequestBinder()
:null;
}
}
公共类页面请求绑定器:IModelBinder
{
公共任务BindModelAsync(ModelBindingContext bindingContext)
{
if(bindingContext==null)
{
抛出新ArgumentNullException(nameof(bindingContext));
}
var pagedList=(IPagedRequest)bindingContext.Model;
如果(pagedList.Page==0)pagedList.Page=1;
如果(pagedList.PageSize==0)pagedList.PageSize=25;
bindingContext.Result=ModelBindingResult.Success(页面列表);
返回Task.CompletedTask;
}
}
对于将请求主体绑定到模型,有两种类型,一种是通过[FromForm]
从表单数据
绑定,另一种是通过[fromfombody]
从应用程序/json
绑定
对于[FromForm]
,它通过IModelBinder
绑定模型;对于FromBody
,它使用JsonFormatter
对于操作中的[FromBody]
,请尝试以下步骤:
public class CustomJsonInputFormatter : JsonInputFormatter
{
public CustomJsonInputFormatter(
ILogger logger,
JsonSerializerSettings serializerSettings,
ArrayPool<char> charPool,
ObjectPoolProvider objectPoolProvider,
MvcOptions options,
MvcJsonOptions jsonOptions) : base(logger, serializerSettings, charPool, objectPoolProvider, options, jsonOptions)
{
}
public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
{
InputFormatterResult result = await base.ReadRequestBodyAsync(context, encoding);
var pagedList = (IPagedRequest<object>)result.Model;
if (pagedList != null)
{
if (pagedList.Page == 0) pagedList.Page = 1;
if (pagedList.PageSize == 0) pagedList.PageSize = 25;
}
return result;
}
}
公共类CustomJsonInputFormatter:JsonInputFormatter
{
公共自定义JSONInputFormatter(
ILogger记录器,
JsonSerializerSettings序列化rSettings,
ArrayPool charPool,
ObjectPoolProvider ObjectPoolProvider,
MVCOPIONS选项,
MvcJsonOptions jsonOptions):基本(记录器、序列化设置、字符池、objectPoolProvider、选项、jsonOptions)
{
}
公共重写异步任务ReadRequestBodyAsync(InputFormatterContext上下文,编码)
{
InputFormatterResult结果=wait base.ReadRequestBodyAsync(上下文,编码);
var pagedList=(IPagedRequest)result.Model;
如果(页面列表!=null)
{
如果(pagedList.Page==0)pagedList.Page=1;
如果(pagedList.PageSize==0)pagedList.PageSize=25;
}
返回结果;
}
}
services.AddMvc(options => {
var serviceProvider = services.BuildServiceProvider();
var customJsonInputFormatter = new CustomJsonInputFormatter(
serviceProvider.GetRequiredService<ILoggerFactory>().CreateLogger<CustomJsonInputFormatter>(),
serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value.SerializerSettings,
serviceProvider.GetRequiredService<ArrayPool<char>>(),
serviceProvider.GetRequiredService<ObjectPoolProvider>(),
options,
serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value
);
options.InputFormatters.Insert(0, customJsonInputFormatter);
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddMvc(选项=>{
var serviceProvider=services.BuildServiceProvider();
var customJsonInputFormatter=新的customJsonInputFormatter(
serviceProvider.GetRequiredService().CreateLogger(),
serviceProvider.GetRequiredService().Value.SerializerSettings,
serviceProvider.GetRequiredService(),
serviceProvider.GetRequiredService(),
选项,
serviceProvider.GetRequiredService().Value
);
options.InputFormatters.Insert(0,customJsonInputFormatter);
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
[HttpPost]
public ActionResult Test([FromBody]PagedRequest<Product> input)
{
return Ok(new PagedRequest<Product> {
Page = 1,
PageSize = 100
});
}
[HttpPost]
公共操作结果测试([FromBody]PagedRequest输入)
{
返回Ok(新页面请求{
第页=1,
页面大小=100
});
}
IPagedRequest的具体实现在哪里?您不能在构造函数中设置默认值吗?@RuiFernandes,我有许多IPagedRequest的实现(例如GetProductsRequest、GetCategoriesRequest…)。所以我想在一个地方设置分页属性的默认值。您可以创建一个基类,例如RequestBase,并在那里定义这些属性的默认值。什么是请求内容类型,
application/json
或form data
?@Edward,application/json