Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过模型绑定将原始查询字符串作为控制器操作参数?_C#_Asp.net Core_Model Binding - Fatal编程技术网

C# 如何通过模型绑定将原始查询字符串作为控制器操作参数?

C# 如何通过模型绑定将原始查询字符串作为控制器操作参数?,c#,asp.net-core,model-binding,C#,Asp.net Core,Model Binding,我想将原始查询字符串作为控制器操作参数: // ///返回过滤电汇 /// [HttpGet(“电汇”)] [产品响应类型(类型(LoadResult),状态代码。状态200OK)] [产品响应类型(StatusCodes.Status400BadRequest)] 公共任务 RawQueryStringAttribute.cs: [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)] 公共类RawQue

我想将原始查询字符串作为控制器操作参数:

//
///返回过滤电汇
/// 
[HttpGet(“电汇”)]
[产品响应类型(类型(LoadResult),状态代码。状态200OK)]
[产品响应类型(StatusCodes.Status400BadRequest)]
公共任务

RawQueryStringAttribute.cs

[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)]
公共类RawQueryStringAttribute:属性,IBindingSourceMetadata,IModelNameProvider
{
公共BindingSource BindingSource=>
RawQueryStringBindingSource.Instance;
公共字符串?名称{get;set;}
}
RawQueryStringBindingSource.cs

公共静态类RawQueryStringBindingSource
{
public const string Id=“RawQueryString”;
public const string Name=Id;
公共静态只读BindingSource实例=新BindingSource(
身份证件
名称
我是贪婪的:错,
isFromRequest:true);
}
RawQueryStringValueProvider.cs

公共类RawQueryStringValueProvider:BindingSourceValueProvider
{
公共RawQueryStringValueProvider(BindingSource BindingSource,字符串rawQueryString):基(BindingSource)=>
RawQueryString=RawQueryString;
私有字符串RawQueryString{get;}
公共覆盖bool ContainsPrefix(字符串前缀)=>
虚假的;
公共覆盖值ProviderResult GetValue(字符串键)=>
string.IsNullOrEmpty(键)
?新值提供程序结果(RawQueryString)
:ValueProviderResult。无;
}
RawQueryStringValueProviderFactory.cs

公共类RawQueryStringValueProviderFactory:IValueProviderFactory
{
公共任务CreateValueProviderAsync(ValueProviderFactoryContext上下文)
{
var rawQueryString=context.ActionContext.HttpContext.Request?.QueryString.Value;
context.ValueProviders.Add(
新建RawQueryStringValueProvider(RawQueryStringBindingSource.Instance,
罗克林!);
返回Task.CompletedTask;
}
}
但当控制器操作被调用时,类似于:

http://localhost:5000/api/v1/wire-传输?requireTotalCount=true&skip=0&take=5

我得到以下错误:

{
   "errors":{
      "rawQueryString":[
         "The rawQueryString field is required."
      ]
   },
   "type":"https://tools.ietf.org/html/rfc7231#section-6.5.1",
   "title":"One or more validation errors occurred.",
   "status":400,
   "traceId":"|dd22ddb4-44ebc27fb1cbc9ba."
}
不知道为什么,有什么想法吗

如果我这样做,为了避免任何误解:

//
///返回过滤电汇
/// 
[HttpGet(“电汇”)]
[产品响应类型(类型(LoadResult),状态代码。状态200OK)]
[产品响应类型(StatusCodes.Status400BadRequest)]
公共任务GetAsync(
[BealerTokenFromHeader]字符串BealerToken,
CancellationToken CancellationToken=默认值)=>
this.trycatch.callExceptionSync(
()=>\u成员CreditorWireTransfersService
.GetAsync(bearerToken,this.Request.QueryString.Value,cancellationToken));
同样的请求也很有效

我的观点是,我只想将
this.Request.QueryString.Value
作为控制器操作参数。

尝试使用双星号(**)
捕获所有参数

像这样的东西应该可以达到你想要的效果:

[HttpGet("wire-transfers/{**rawQueryString}")]
public ... GetAsync(string rawQueryString) { ... }
尝试使用双星号(**)
catch all
参数

像这样的东西应该可以达到你想要的效果:

[HttpGet("wire-transfers/{**rawQueryString}")]
public ... GetAsync(string rawQueryString) { ... }

好吧,问题非常简单:

基本上,我忘记注册相关的值提供程序工厂(facepalm)

public void配置服务(IServiceCollection服务)
{
// ... 
服务
.AddMvc(选项=>
{
options.EnableEndpointRouting=false;
options.Filters.Add();
options.valueProviderFactorys.Add(新BeareTokenValueProviderFactory());
options.valueProviderFactorys.Add(新的RawQueryStringValueProviderFactory());
}).AddNewtonsoftJson();
// ...
}
我已经为
BealerTokenfromHeaderAttribute
做了这些。。。但是忘记了对
RawQueryStringAttribute执行操作


现在一切都像一个魔咒一样运作。

好吧,问题非常简单:

基本上,我忘记注册相关的值提供程序工厂(facepalm)

public void配置服务(IServiceCollection服务)
{
// ... 
服务
.AddMvc(选项=>
{
options.EnableEndpointRouting=false;
options.Filters.Add();
options.valueProviderFactorys.Add(新BeareTokenValueProviderFactory());
options.valueProviderFactorys.Add(新的RawQueryStringValueProviderFactory());
}).AddNewtonsoftJson();
// ...
}
我已经为
BealerTokenfromHeaderAttribute
做了这些。。。但是忘记了对
RawQueryStringAttribute执行操作


现在,一切都很有魅力。

Url格式不正确,我猜。@Md.khirulislami不,是。。。我将更新帖子,以便您更好地理解。Url格式不正确,我猜。@Md.khirulislami不,是。。。我会更新帖子,让你更好地理解。谢谢,我发现了这个问题,虽然它与你的答案完全无关,但我还是投了赞成票,因为这是一次有趣的尝试。谢谢,我发现了这个问题,虽然它与你的答案完全无关,但我还是投了赞成票,因为这是一个有趣的拍摄。