这是我之前问题的精神继承者 Web API attribute routing and validation - possible? ,我认为这太笼统了,无法回答。大多数问题都已解决,但默认值问题仍然存在。
基本上我已经解决了很多难题。我有这个:
[HttpGet]
[Route("test/{id}"]
public IHttpActionResult RunTest([FromUri]TestRequest request)
{
if (!ModelState.IsValid) return BadRequest(ModelState);
return Ok();
}
我的 TestRequest
类:
public class TestRequest
{
public string id { get; set; }
[DefaultValue("SomethingDefault")]
public string something { get; set; }
}
问题是,如果 something
的查询字符串中没有参数,模型是“有效的”,但 something
是 null
.
如果我为 something
指定一个空值(即 GET test/123?something=
),那么默认值开始起作用,模型再次有效.
这是为什么?如何在此处为我的模型获取默认值?作为奖励,为什么在未指定参数时不使用默认值,但在明确指定空字符串时使用默认值?
(我一直在浏览 ASP.NET 堆栈源代码,并且深谙模型绑定(bind)器和绑定(bind)上下文。但我最好的猜测不可能是正确的 - 它看起来像 DefaultValueAttribute
仅在参数值为null
时使用。但这里不是这种情况)
最佳答案
您需要在模型的构造函数中初始化默认值:
public class TestRequest
{
public TestRequest()
{
this.something = "SomethingDefault";
}
public string id { get; set; }
[DefaultValue("SomethingDefault")]
public string something { get; set; }
}
更新:
使用 C# 6,您不再需要在构造函数中对其进行初始化。您可以直接将默认值分配给属性:
public class TestRequest
{
public string id { get; set; }
[DefaultValue("SomethingDefault")]
public string something { get; set; } = "SomethingDefault";
}
作为documentation of the DefaultValueAttribute状态:
Note
A DefaultValueAttribute will not cause a member to be automatically initialized with the attribute's value. You must set the initial value in your code.
如果您没有为您的 something
属性提供任何值,该属性将被初始化并且 ModelBinder
没有可分配给它的值,并且因此该属性默认为其默认值。
关于c# - Web API 模型验证和默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30482415/