gpt4 book ai didi

c# - 即使没有请求参数,Web API 参数绑定(bind)也返回实例

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:45 24 4
gpt4 key购买 nike

使用 ASP.NET 的 WebApi,我如何确保一个复杂的 Action 参数总是被实例化?即使没有请求参数(在 QueryString 或 POST 正文中)。

例如,给定这个虚拟 Action 定义:

public IHttpActionResult GetBlahBlah(GetBlahBlahInput input) { .. }

我希望 input 始终是 GetBlahBlahInput 的实例化实例。默认行为是,如果请求参数存在于请求中的任何位置,则 input 不为空(即使没有任何请求参数可绑定(bind)到 GetBlahBlahInput。)但是,如果没有参数被发送,则 GetBlahBlahInputnull。我不想要 null,我想要一个使用无参数构造函数创建的实例。

基本上,我正在尝试实现这个:

http://dotnet.dzone.com/articles/interesting-json-model-binding

在 WebApi 领域(因此没有 DefaultModelBinder 继承)并且我希望它是通用的,因此它可以处理任何输入类型。

我在 WebApi 中使用默认的 JsonMediaFormatter 支持。

有什么想法吗?我很确定它可以完成,我可能在某处遗漏了一个简单的配置步骤。

最佳答案

我还在想我问的能不能实现。但目前,这是我在我的 ActionFilterAttribute 中实现的解决方法(inputKey 是参数的名称;在原始问题中它是 input):

// look for the "input" parameter and try to instantiate it and see if it implements the interface I'm interested in
var parameterDescriptor = actionContext.ActionDescriptor.GetParameters().FirstOrDefault(p => string.Compare(p.ParameterName, inputKey, StringComparison.InvariantCultureIgnoreCase) == 0);
if (parameterDescriptor == null
|| (inputArgument = Activator.CreateInstance(parameterDescriptor.ParameterType) as IHasBlahBlahId) == null)
{
// if missing "input" parameter descriptor or it isn't an IHasBlahBlahId, then return unauthorized
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
return;
}

// otherwise, take that newly instantiated object and throw it into the ActionArguments!
if (actionContext.ActionArguments.ContainsKey(inputKey))
actionContext.ActionArguments[inputKey] = inputArgument;
else
actionContext.ActionArguments.Add(inputKey, inputArgument);

关于c# - 即使没有请求参数,Web API 参数绑定(bind)也返回实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22765087/

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