即使没有请求参数,Web API参数绑定也会返回实例

时间:2014-03-31 15:02:15

标签: c# asp.net asp.net-web-api

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

例如,给定这个虚拟动作定义:

public IHttpActionResult GetBlahBlah(GetBlahBlahInput input) { .. }

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

基本上,我正在努力实现这个目标:

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

在WebApi中(所以没有null继承)并且我希望它是通用的,所以它可以处理任何输入类型。

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

有什么想法?我很确定它可以完成,我可能在某个地方错过了一个简单的配置步骤。

1 个答案:

答案 0 :(得分:0)

我仍然想知道我问的问题是否可以完成。但目前,我在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);