如何将剩余查询参数绑定到 ASP.NET Core 中的字典

Bra*_*ldt 3 c# asp.net-core

我正在为 ASP.NET Core 应用程序使用模型绑定,它配置了几个已知属性,然后是一个我想要添加任何其他 URL 属性的字典。我希望我的查询字符串如下所示:

/foobar?Id=5&Status=pending&SpecialKey=test
Run Code Online (Sandbox Code Playgroud)

并让它填充我的模型,其中属性Id = 5, Status = Pending,并有一个字典调用ExtraParams一个项目,“SpecialKey”的键和“test”的值。

现在这是我的模型:

using Microsoft.AspNetCore.Http;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text.Json.Serialization;

namespace MyProject.Models
{
    public class MyCustomModel
    {
        public string? Id { get; set; }
        public string? Status { get; set; }
        public string? SerialNumber { get; set; }
        public string? Nickname { get; set; }
        public string? DisplayName { get; set; }

        [JsonExtensionData]
        public Dictionary<string, object> ExtraParams { get; set; } = new Dictionary<string, JToken>();
    }
}
Run Code Online (Sandbox Code Playgroud)

就目前情况而言,仅填充 Id/Status。我可以获得任何内容的唯一方法ExtraParams是使用ExtraParams[key]=test我不想要的查询字符串表示法。

ska*_*e89 5

我有一个类似的用例。以下是我使用的步骤

  • 向控制器操作方法添加可选参数
public async Task<IActionResult> GetAllItemsAsync(string searchString, int? pageNo = 1, int? pageSize = 10, Dictionary<string, object> filters = null)
{
   <My-Controller-Logic>
}
Run Code Online (Sandbox Code Playgroud)
  • 创建了 ActionFilterAttribute 覆盖
    public class QueryStringActionFilter : ActionFilterAttribute
    {
        private const string _additionalParamsFieldName = "filters";

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var filters = new Dictionary<string, object>();
            foreach (var kvp in context.HttpContext.Request.Query)
            {
                if (!context.ActionArguments.ContainsKey(kvp.Key))
                {
                    filters.Add(kvp.Key, kvp.Value);
                }
            }
            context.ActionArguments[_additionalParamsFieldName] = filters;
            base.OnActionExecuting(context);
        }
    }
Run Code Online (Sandbox Code Playgroud)
  • 将 Action 过滤器属性添加到我的控制器操作方法中
[QueryStringActionFilter]
public async Task<IActionResult> GetAllItemsAsync(string searchString, int? pageNo = 1, int? pageSize = 10, Dictionary<string, object> filters = null)
{
   <My-Controller-Logic>
}
Run Code Online (Sandbox Code Playgroud)

这样,除 searchString、pageNo 和 pageSize 之外的所有查询参数都会填充到过滤器内。