【问题标题】:Web Api GET method that has a nullable Guid possible?可能具有可为空 Guid 的 Web Api GET 方法?
【发布时间】:2012-10-10 20:29:18
【问题描述】:

我有一个 MVC Web API get 方法,我希望能够将一个可为空的 Guid 作为参数传递。如果我使用“?Id=null”设置 GET,我会收到 400 响应。我可以传递一个空的 guid,但我宁愿不这样做。

无论我将 URI 更改为“id=、id=null 等”,它都不会接受 null。有谁知道如何进行这项工作?

  [HttpGet]
  public User Get(Guid? Id)

更新路由配置

  config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

完整的Http Get签名,sourceId是id喜欢传为null的参数。

 [HttpGet]
  public IEnumerable<ActionItemsListViewModel> GetPagedList(int skip, int take, int page, int pageSize, [FromUri]List<GridSortInfo> sort, [FromUri] ActionItem.ActionItemStatusTypes? actionItemStatus, Guid? sourceId)

发现问题,这个过滤器说 ModelState 无效。

public class ApiValidationActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid )
        {
            var errors = actionContext.ModelState
                .Where(e => e.Value.Errors.Count > 0)
                .Select(e => e.Value.Errors.First().ErrorMessage).ToList();

            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, string.Join(" ", errors));
        }
    }
}

【问题讨论】:

  • 你有没有尝试不通过任何东西?
  • @murilokunze 是的,这确实有效,不幸的是,我与 api 一起使用的控件不允许我排除参数。

标签: asp.net-mvc asp.net-web-api


【解决方案1】:

尝试使用:

[HttpGet]
public User Get(Guid? Id = null)

【讨论】:

  • 如果你使用基于属性的路由尝试:[Route("{id?}")] public User Get(Guid?Id = null)
【解决方案2】:

我能够将 null 传递给 Guid?当我使用

  • 查询字符串参数:api/values?id=null
  • 路由参数:api/values/null

控制器:

 public class ValuesController : ApiController
 {
     public User Get(Guid? Id)
     { ... }
 }

【讨论】:

  • 感谢您的回复。我已经在查询字符串中尝试了 ?id=null 并且我得到了返回“值'null'对于 Nullable`1 无效。”你能解释一下“路由参数:api/values/null”是什么意思吗?
  • 当您执行 ?id=null 时,我无法重现您的问题。你的 ApiController 看起来像我的 repro ValuesController 吗?
  • 对于路由参数,我使用“DefaultApi”路由(使用 routeTemaplte“api/{controller}/{id}”)在执行此操作时将 {id} 映射为 null:api /values/null.(这个默认路由在 WebApiConfig.Register(...) 中定义)
  • 再次感谢您的帮助。我用更多细节更新了原始问题。我简化了原始问题以使其更易于理解,但现在我提供了更多细节。我正在使用 Telerik kendo 网格,它将其分页信息传递给 web api 方法。
  • (1) 您能否提供导致错误“值 'null' 对 Nullable`1 无效。”的 URL? (2) ActionItem.ActionItemStatusTypes 是什么类型?它是结构还是枚举? (可能是这个参数导致了错误)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2012-04-04
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
相关资源
最近更新 更多