【问题标题】:Bind WebAPI properties without action parameter绑定没有操作参数的 WebAPI 属性
【发布时间】:2017-03-30 17:53:09
【问题描述】:

我们的许多 Web API 操作模式都具有以下模式:

public IHttpActionResult GetDetails(Guid customerGuid)
{
    Customer customer = customerRetriever.FromGuid(customerGuid);

    if (customer == null)
        return NotFound();

    // Do Stuff....
}

我想将所有客户查找样板移出操作方法。我创建了一个操作过滤器属性来执行此操作,方法是查看操作参数的值并设置请求属性:

KeyValuePair<String, Object> argument = actionContext.ActionArguments.Single(kvp => kvp.Key.Equals(ParameterName));
Guid customerGuid = (Guid)argument.Value;
// Do customer lookup, return 404 if needed
// Add customer to request properties

这可行,但我仍然需要在我的操作签名中包含现在多余的 Guid。如果我删除它,我查找 Guid 值的方法将失败。有没有办法从 URI 中绑定一个值,而无需将该值作为操作参数?

【问题讨论】:

  • 如果用户拨打电话,客户ID是ID吗?还是用户打电话来查看特定客户?如果是前者,那么这就是身份验证和授权操作过滤器的用途。

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


【解决方案1】:

您必须将 customerGuid 作为 queryString 参数传递,例如 http://localhost:61374/api/values?customerGuid=D09584F2-0B81-4855-8F33-567F4EF8096C 然后您可以在操作过滤器中获取查询字符串值:

  public class CustomFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var queryStringValues = actionContext.Request.GetQueryNameValuePairs();
        var customerGuid = queryStringValues.FirstOrDefault(x => x.Key == "customerGuid").Value;
        //Your logic
    }
}

现在不需要在 API 方法中指定参数了

public IHttpActionResult GetDetails()
{
  //Do stuff
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多