ModelState.Isvalid无效字段,即使存在默认值

时间:2017-08-10 18:33:59

标签: 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;}
}

ActionFilter

public class ValidateViewModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ModelState.IsValid == false) {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
        }
    }
}

现在,当值发布到API时,不设置“密钥”字段,因为它是SAVE的请求。问题是,上面的属性说,对于字段“key”,MODEL IS INVALID。它已经存在Id字段的0值(默认为int)。 我希望,它应该验证为0,因为0是默认值。

注意:我无法删除或更改上面的BASEENTITY和PARENT实体。 我只控制CHILD实体和这个属性类。

2 个答案:

答案 0 :(得分:0)

要忽略标记为[Required]的媒体资源,您可以使用ModelState.Remove("propertyName");

此外,您的媒体资源的值为0,因为int的值不能为NULL,因此会自动归因于0。但是,如果您未在表单数据中传递此值,则模型验证将“考虑”它为NULL,从而使模型无效。如果您不想使用上面显示的Remove调用,则必须明确为Key属性赋值:-) 来源:The first comment on this page - 这个解释归功于@Stephen Muecke

使用类似

的内容
public class ValidateViewModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        ModelState.Remove("key");
        if (actionContext.ModelState.IsValid == false) {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
        }
    }
}

注意:默认情况下,MVC6模型验证将根据需要简单标记所有不可为空的值类型(上帝知道原因)。 调用

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

禁用此行为。

答案 1 :(得分:0)

我有同样的问题,并通过以下方式解决了它:

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

将模型替换为viewModel,因为在viewModel中我们没有ID(请参阅Use ViewModel

那么我们将有:

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