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));
        }