gpt4 book ai didi

asp.net-mvc - 当我有一个可为空的参数时,ModelState.IsValid 为 false

转载 作者:行者123 更新时间:2023-12-03 14:34:39 25 4
gpt4 key购买 nike

我重现了我在一个全新的 MVC Web API 项目中遇到的问题。

这是默认代码,稍作修改。

public string Get(int? id, int? something = null)
{
var isValid = ModelState.IsValid;
return "value";
}

如果你去 http://localhost/api/values/5?something=123那么这工作正常,isValid 是 true .

如果你去 http://localhost/api/values/5?something=那么 isValid 是 false .

我遇到的问题是,如果您为可为空的项目提供空值或省略值,则 ModelState.IsValid 会标记验证错误,说明 "A value is required but was not present in the request."
ModelState 字典也如下所示:

enter image description here
something 有两个条目,一个可以为空的,我不确定它是否重要。

知道如何解决此问题,以便在省略可空参数或提供为空参数时模型有效吗?我在我的 web api 中使用模型验证,如果每个带有可为空参数的方法都生成模型错误,它会破坏它。

最佳答案

似乎默认绑定(bind)模型不能完全理解可为空的类型。从问题中可以看出,它给出了三个参数错误,而不是预期的两个。

您可以使用自定义可为空的模型绑定(bind)器解决此问题:

模型活页夹

public class NullableIntModelBinder : IModelBinder
{
public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof(int?))
{
return false;
}

ValueProviderResult val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (val == null)
{
return false;
}

string rawvalue = val.RawValue as string;

// Not supplied : /test/5
if (rawvalue == null)
{
bindingContext.Model = null;
return true;
}

// Provided but with no value : /test/5?something=
if (rawvalue == string.Empty)
{
bindingContext.Model = null;
return true;
}

// Provided with a value : /test/5?something=1
int result;
if (int.TryParse(rawvalue, out result))
{
bindingContext.Model = result;
return true;
}

bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Cannot convert value to int");
return false;
}
}

用法
public ModelStateDictionary Get(
int? id,
[ModelBinder(typeof(NullableIntModelBinder))]int? something = null)
{
var isValid = ModelState.IsValid;

return ModelState;
}

改编自 asp.net 页面: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api以供进一步阅读和在类( Controller )级别而不是按参数设置它的替代方法。

这处理了 3 个有效场景:
/test/5
/test/5?something=
/test/5?something=2

这首先将“某物”设为空。其他任何内容(例如 ?something=x )都会出错。

如果您将签名更改为
int? somthing

(即删除 = null )然后您必须显式提供参数,即 /test/5除非您也调整路线,否则这将不是有效路线。

关于asp.net-mvc - 当我有一个可为空的参数时,ModelState.IsValid 为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32861365/

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