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

标签 c# asp.net-web-api

这是我之前问题的精神继承者 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/

相关文章:

asp.net-mvc - 是否可以在MVC网站上使用自定义错误页面,但不能在Web API上使用?

c# - 遗传算法框架中的随机化不佳

c# - 为什么我在微软的引用源里看不到源码?

c# - .Net Core - Entity Framework - MySQL > 未找到 UseMysql

c# - 在 C# selenium 测试运行时打开 Google Chrome 开发者工具控制台,或者以编程方式读取它

c# - 在解决方案中拆分 WebApi 项目和 FrontEnd 项目

c# - UInt32 的参数数据类型无效。 (微软 SQL 服务器)

asp.net-mvc-4 - 使用 Web Api 和结构图依赖注入(inject)

c# - 包含循环,如果引用跟踪被禁用,则无法序列化,json.net 和 webapi

javascript - 带有 Node js 的 CRM WebAPI 2016