C# ASP.NET核心MVC默认模型值

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;

在我的应用程序中,我使用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;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]
,请尝试以下步骤:

  • 创建自定义json格式化程序

    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;
    }
    返回结果;
    }
    }
    
  • 注册json格式化程序

        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