Web API 属性路由和验证 - 可能吗?

Kie*_*one 5 validation asp.net-mvc modelstate asp.net-web-api

我正在尝试将 Web API 中基于属性的路由与模型验证结合起来。我根本无法让它按照我的预期工作。

class MyRequestModel
{
    [DefaultValue("DefaultView")]
    public string viewName { get; set; }

    [Required]
    public string something { get; set; }
}

[HttpGet]
[Route("myroute/{id:minlength(2)}")]
public IHttpActionResult Test(string id, [FromUri]MyRequestModel request)
{
    if (!ModelState.IsValid) { return BadRequest(ModelState); }
    // process here...
    return Json( /* result */ );
}
Run Code Online (Sandbox Code Playgroud)

虽然something验证正确,但我有一些问题:

  • 当我仅指定一个something参数值时,该值通过 OK,但viewName通过 as null,但模型状态有效 - 我期望默认值,因为没有指定任何内容
  • 当我指定空白viewName参数 ( ?something=x&viewName=) 时,它会通过 as "DefaultView",并且模型状态有效 - 我希望它作为指定的空白字符串
  • 如果我删除[FromUri],request则始终如一null
  • 似乎没有办法将路由参数包含为模型的一部分(即id必须是参数,而不是请求模型的一部分),这意味着 - 我认为 - 我不能对路由参数使用模型状态验证

我正在手动验证参数,但我想我会尝试利用模型状态验证的预构建功能和强大功能。然而,我承认,由于有关 MVC、Web API 及其各种版本的大量重叠且有时相互矛盾的文档,我无法找到任何单一的事实来源 - 只有 ASP.NET 站点上的快速入门指南。这里也非常欢迎指点!

难道就不可能按照我期望的方式将这些东西结合起来吗?没有DefaultValueAttribute做我认为的那样吗?我是否可以不以某种方式验证控制器的所有参数 - 包括作为路由一部分出现的参数?