Validation 即使存在默认值,ModelState.Isvalid字段仍然无效
动作过滤器Validation 即使存在默认值,ModelState.Isvalid字段仍然无效,validation,asp.net-web-api,asp.net-mvc-5,required,modelstate,Validation,Asp.net Web Api,Asp.net Mvc 5,Required,Modelstate,动作过滤器 public abstract class Base : IBase { [Required] public int key {get;set;} } public class Entity: Base { public string Name {get;set;} } public class child : Entity { [Required] public string Park {get;set;} } 现在,当值发布到API时,不设置“
public abstract class Base : IBase
{
[Required]
public int key {get;set;}
}
public class Entity: Base
{
public string Name {get;set;}
}
public class child : Entity
{
[Required]
public string Park {get;set;}
}
现在,当值发布到API时,不设置“Key”字段,因为它是保存请求。问题是,上面的属性表示,模型对于字段“key”无效。它已经作为Id字段的0值存在(默认为int)。
我希望,它应该验证true,因为0是默认值
注意:我无法删除或更改上面的BASEENTITY和父实体。
我在子实体和该属性类中只有控件。若要忽略标记为
[必需]
的属性,可以使用ModelState.Remove(“propertyName”)代码>
此外,您的属性的值为0,因为int
的值不能为NULL
,因此0会自动归属。但是如果您没有在表单数据中传递此值,那么模型验证将“考虑”它是NULL
,从而使模型无效。如果不想如上所示使用对Remove
的调用,则必须显式地为键
属性指定一个值:-)
资料来源:-这一解释的功劳@Stephen Muecke
使用类似
public class ValidateViewModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false) {
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
注意:默认情况下,MVC6模型验证将根据需要标记所有不可为null的值类型(天知道为什么)。
召唤
禁用此行为。我有相同的问题,并通过以下方式解决:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
并将模型替换为viewModel,因为在viewModel中我们没有ID(请参阅)
然后我们将有:
[AcceptVerbs("Post")]
public ActionResult EditingInline_Create([DataSourceRequest] DataSourceRequest request, Model.Server server)
{
if (server != null && ModelState.IsValid) //Invalid!!
{
_exchangeService.Create(server);
}
return Json(new[] { server }.ToDataSourceResult(request, ModelState));
}
首先,编辑数据时不要在视图中使用数据模型-使用视图模型。并且int
不可为null且不为必需(您还具有[required]
属性,因此如果请求中发送了null
或无效值,则ModelState
将无效(但属性将初始化为其默认值)
[AcceptVerbs("Post")]
public ActionResult EditingInline_Create([DataSourceRequest] DataSourceRequest request, Model.Server server)
{
if (server != null && ModelState.IsValid) //Invalid!!
{
_exchangeService.Create(server);
}
return Json(new[] { server }.ToDataSourceResult(request, ModelState));
}
[AcceptVerbs("Post")]
public ActionResult EditingInline_Create([DataSourceRequest] DataSourceRequest request, ViewModel.ServerViewModel server)
{
if (server != null && ModelState.IsValid)
{
_exchangeService.Create(server);
}
return Json(new[] { server }.ToDataSourceResult(request, ModelState));
}