我有一个WebAPI方法如下:
public HttpResponseMessage Post(ITradeCustomerPrincipal user, OrderModel value)
我收到错误
无法将多个参数('user'和'value')绑定到请求的内容。
当我试着打电话的时候。我理解为什么。
我有一个全局应用的属性,会将ITradeCustomerPrincipal
注入任何操作,如下所示:
public class TradeConsumerFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var matchedArguments = actionContext.ActionDescriptor.ActionBinding.ParameterBindings
.SingleOrDefault(pb => typeof(ITradeCustomerPrincipal).IsAssignableFrom(pb.Descriptor.ParameterType));
if (matchedArguments != null)
{
var TradeCustomerPrincipal = HttpContext.Current.User as ITradeCustomerPrincipal;
if (TradeCustomerPrincipal != null)
{
actionContext.ActionArguments[matchedArguments.Descriptor.ParameterName] = TradeCustomerPrincipal;
}
}
base.OnActionExecuting(actionContext);
}
}
通过这种方式,动作不需要自己绑定ITradeCustomerPrincipal
,它由属性自动完成。
我如何告诉操作不要绑定user
参数来自正文(或我猜的任何地方),因为它是事先由动作过滤器设置的?
答案 0 :(得分:0)
我已经设法通过创建一个什么都不做的模型绑定器并将它应用于user
参数来实现这个功能,因为它不是一个分配/创建对象的绑定器。
模型活页夹:
public class NoOpModelBinder : IModelBinder
{
public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext, ModelBindingContext bindingContext)
{
return true;
}
}
新的行动方法签名:
public HttpResponseMessage Post([ModelBinder(typeof(NoOpModelBinder))] ITradeCustomerPrincipal user, OrderModel value)
我已经设法弄清楚如何将模型绑定器全局应用于接口(您不能将该属性应用于接口,只能应用于类):
GlobalConfiguration.Configuration.BindParameter(typeof(ITradeCustomerPrincipal), new NoOpModelBinder());
这意味着此参数的任何操作签名都可以在没有ModelBinder
属性的情况下工作。