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实体和这个属性类。
答案 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));
}