gpt4 book ai didi

c# - Web API 模型验证和默认值

转载 作者:太空狗 更新时间:2023-10-29 22:30:39 25 4
gpt4 key购买 nike

这是我之前问题的精神继承者 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 的查询字符串中没有参数,模型是“有效的”,但 somethingnull .

如果我为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com