gpt4 book ai didi

c# - 为什么 WebApi 在模型状态中将空字符串标记为错误?

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

我有 Web API,.Net 4.5.2 的奇怪行为。如果可选字符串参数为 null,则 ModelState 没有错误。如果它不为 null 且不为空,则不会再出现错误。但如果它只是一个空字符串,我就会出现模型状态错误。

为什么我会得到它以及如何禁用它?

假设应用在 localhost:82 上运行,我得到了这些结果:

Url: http://localhost:82/
Response: "null"

Url: http://localhost:82/?q=1
Response: "1"

Url: http://localhost:82/?q=
Response: {
"Message": "The request is invalid.",
"ModelState": {
"q.String": [
"A value is required but was not present in the request."
]
}
}

测试 Controller 和配置如下。在 VS2013 中,这已减少到最低限度的默认“Asp.net web 应用程序”和“WebApi”。

namespace Web.Api.Test.Controllers
{
using System.Web.Http;

[Route]
public class HomeController : ApiController
{
[Route]
[HttpGet]
public IHttpActionResult Search(string q = default(string))
{
return this.ModelState.IsValid
? this.Ok(q ?? "null")
: (IHttpActionResult)this.BadRequest(this.ModelState);
}
}
}

Startup.cs 是:

using Microsoft.Owin;

using WebApplication1;

[assembly: OwinStartup(typeof(Startup))]

namespace WebApplication1
{
using System.Web.Http;

using Newtonsoft.Json;

using Owin;

public class Startup
{
public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configure(config =>
{
config.MapHttpAttributeRoutes();
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;

config.Formatters.Remove(config.Formatters.XmlFormatter);
});
}
}
}

附言:This问题有解决方法,但它没有回答主要问题:为什么会发生这种情况以及此设计决策背后的原因。

最佳答案

我遇到了同样的问题,最后想出了以下问题:

public class SimpleTypeParameterBindingFactory
{
private readonly TypeConverterModelBinder converterModelBinder = new TypeConverterModelBinder();
private readonly IEnumerable<ValueProviderFactory> factories;

public SimpleTypeParameterBindingFactory(HttpConfiguration configuration)
{
factories = configuration.Services.GetValueProviderFactories();
}

public HttpParameterBinding BindOrNull(HttpParameterDescriptor descriptor)
{
return IsSimpleType(descriptor.ParameterType)
? new ModelBinderParameterBinding(descriptor, converterModelBinder, factories)
: null;
}

private static bool IsSimpleType(Type type)
{
return TypeDescriptor.GetConverter(type).CanConvertFrom(typeof (string));
}
}

public class Startup
{
public void Configure(IAppBuilder appBuilder)
{
var configuration = new HttpConfiguration();
configuration.ParameterBindingRules.Insert(0, new SimpleTypeParameterBindingFactory(configuration).BindOrNull);
configuration.EnsureInitialized();
}
}

问题的根源在于 ModelValidationNode 中的一些魔术代码,即使对应的参数具有默认值,它也会为 null 模型创建模型错误。上面的代码只是将 CompositeModelBinder(它调用 ModelValidationNode)替换为 TypeConverterModelBinder 以获得简单的类型参数。

关于c# - 为什么 WebApi 在模型状态中将空字符串标记为错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31790795/

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