后台:ModelState.AddModelError("userPwd", "请输入密码!") ; ModelState是一个字典类型,这句话的作用是向ModelState中添加一条错误信息,第一个参数是Key,第二个参数是Value。 前台:Html.ValidationMessage(key) 或 Html.ValidationSummary() 来显示 对于什么时候使用ModelState.AddModelError(模型错误 _localizationService.GetResource("Event.EventRegister.No_NowEvent"); //进行语言转换 ModelState.AddModelError hadPhoneNumber = _localizationService.GetResource("Event.EventRegister.PhoneNumber"); ModelState.AddModelError
其中一位园友提到了说可以使用MVC的ModelState,因为之前通常都在Web项目中用没在Api项目用过,想想Api方法接收的多参数都封装成了一个实体类,独立于数据Model层,这样其实很方便用ModelState 认识ModelState 我们都知道在MVC中使用ModelState实现表单验证非常简单,借助jquery.validate.unobtrusive这个插件就能轻松的在页面上输出错误信息,详细的介绍可以参考这篇文章 再看看ModelState类型是个什么鬼: [Serializable] public class ModelState { // Fields private ModelErrorCollection (var key in ModelState.Keys) { var state = ModelState[key]; (var key in modelState.Keys) { var state = modelState[key];
ModelState 我理解的ModelState是微软在ASP.NET MVC中提出的一种新机制,它主要实现以下几个功能: 1. 微软的一种DRY(Don't Repeat Yourself)设计,通过ModelState可以做服务端验证,同时可以配合jquery validation生成前端数据验证。 但是在Web API里面,ModelState的主要功能就只剩下第2点了。 需要注意的是,ModelState一般只做输入验证,一些其他的业务验证还有要在特定的地方进行处理。 ModelState.IsValid) { return BadRequest(ModelState); } return CreatedAtRoute ModelState.IsValid) //{ // return BadRequest(ModelState); //} return
ModelState.IsValid) { return BadRequest(ModelState); } 只要其中有一个验证没通过, 那么ModelState.IsValid属性就是False. 可以设置断点查看ModelState里面都有哪些东西. ModelState.IsValid) { return BadRequest(ModelState); } ModelState.IsValid) { return BadRequest(ModelState); } 我们做了ModelState检查, 但是为什么没有验证出来呢?
)
27: {
28: Response.Write(key + "
");
29: ModelState modelState 我们知道输出的ModelState的值是在Model绑定过程中通过ValueProvider提供的,而伴随着Model绑定的验证则会根据验证的结果对ModelState的ModelError进行设置。 在该方法执行过程中,如果具有相同Key的ModelState对象存在,那么被添加的ModelError将会直接添加到它的Errors集合中;否则会添加一个新的ModelState并将添加的ModelError <KeyValuePair<string, ModelState>>,
3: IEnumerable<KeyValuePair<string, ModelState>>, IEnumerable 在Action方法Index中,我们通过调用当ModelState属性的AddModelError方法认为地添加三个错误消息,对应的ModelState名称与作为Model的Contact类型的属性名称一致
ModelMetadata = propertyMetadata, ModelName = fullPropertyKey, ModelState = bindingContext.ModelState, ValueProvider = bindingContext.ValueProvider modelState = bindingContext.ModelState[fullPropertyKey]; if (modelState == null || modelState.Errors.Count , displayName); modelState.Errors.Remove(error); modelState.Errors.Add(errorMessage); break; }
传入匿名方法,并且配置错误警告的详细信息 var problemDetails = new ValidationProblemDetails(context.ModelState TryValidateModel(ModelState)) { return ValidationProblem(ModelState EmployeeUpdateDto>(employeeEntity); // 使用 patchDoucument ,将请求传递的参数传递给 dto 类 // 传递第二个参数,ModelState ,则可以都请求传递的数据进行数据验证 patchDocument.ApplyTo(dtoToPatch, ModelState); // TryValidateModel TryValidateModel(dtoToPatch)) { return ValidationProblem(ModelState);
ModelState.IsValid) { foreach (var item in ModelState.Values) context.ModelState.IsValid) { var result = context.ModelState.Keys .SelectMany(key => context.ModelState[key].Errors.Select(x => new ValidationError(key, x.ErrorMessage ) { Code = 422; Message = "参数不合法"; Result = modelState.Keys context.ModelState.IsValid) { context.Result = new ValidationFailedResult(context.ModelState
StackOverflow上也有对这个问题的描述http://stackoverflow.com/questions/1775170/asp-net-mvc-modelstate-clear 闲话少说, 如下所示,当InputHelper在指定表单元素值得时候,会先从当前ModelState中获取,如果该值在ModelState中不存在,才会从当前ViewData中获取。 对于本例来说,ModelState中的值是原始值,ViewData的值采用修改后的值。 其实我觉得严格来说也是无奈之举吧, 拿Update场景来说 比如说Model里面的某个Property可能是Int的,但是你传入的Form值却可能是任意的字符串,这时后台ModelState.IsValid 所以这个角度看来ModelState的优先级是比较高的。 [你总不能回显一个0,然后错误提示“你输入的不是数值类型”吧]
ModelState.IsValid) { return Page(); } _context.Attach(Movie).State = EntityState.Modified 那么我们看看怎么直接读取这个文本文件; public static async Task<string> ProcessFormFile(IFormFile formFile, ModelStateDictionary modelState = "text/plain") { modelState.AddModelError(formFile.Name, $"The {fieldDisplayName 调用上面方法的代码如下: var publicScheduleData = await FileHelpers.ProcessFormFile(FileUpload.UploadPublicSchedule, ModelState ); 其中ModelState是PageModel特有的属性 在本示例中,用于给页面添加错误信息~
Confirm { get; set; } } 添加了对应的验证标记之后, ASP.NET WebAPI 在参数绑定时会根据验证标记做相应的检查, 并将检查结果放在 ApiController 的 ModelState ApiController { [HttpPost] public IHttpActionResult Register(RegisterModel model) { if (ModelState.IsValid return Ok(model.Username); } return BadRequest(ModelState); } } 如果我们只输入用户名, 没有输入密码和确认密码 ", "ModelState": { "model.Password": ["The Password field is required."], "model.Confirm
自动模型状态验证 这个是重点,框架会帮你自动验证model的state,也就是ModelState. 他内部会检查ModelState是否为Valid,如果为InValid会直接返回400 BadRequest,这样就没有必要执行后面的代码,提高效率。 ) //判断状态 { return BadRequest(ModelState); } //其他代码。。。 Controller { [HttpPost("")] public IActionResult PostBook(Book book) { //直接写,不用验证modelstate options.InvalidModelStateResponseFactory = actionContext => { var errors = actionContext.ModelState
自动模型状态验证 这个是重点,框架会帮你自动验证model的state,也就是ModelState. 他内部会检查ModelState是否为Valid,如果为InValid会直接返回400 BadRequest,这样就没有必要执行后面的代码,提高效率。 ) //判断状态 { return BadRequest(ModelState); } //其他代码。。。 Controller { [HttpPost("")] public IActionResult PostBook(Book book) { //直接写,不用验证modelstate options.InvalidModelStateResponseFactory = actionContext => { var errors = actionContext.ModelState
IMessage message; try { //如果是set方法,且不是设置ModelState 的方法,且ModelState为Modified时,记录更新字段 if (callMsg.MethodName.StartsWith("set_") && args.Length callMsg.MethodName.Contains("ModelState")) { object obj = = type.GetProperty("ModelState"); if ((ModelStateEnum)ModelState.GetValue(obj return message; } return msg; 判断MethodInfo的以set_开头并且不为设置基类状态属性ModelState
code var fluent = mvvmContext.OfType<ViewModel>(); fluent.SetBinding(check, e => e.CheckState, x => x.ModelState , modelState => { // Convert the ViewModel.State to CheckState switch(modelState) { case ViewModel.State.Active return ViewModel.State.Suspended; } }); //ViewModel code public class ViewModel { public virtual State ModelState mvvmContext.OfType(Of ViewModel)() fluent.SetBinding(check, Function(e) e.CheckState, Function(x) x.ModelState , Function(modelState) Select Case modelState Case ViewModel.State.Active [Return] CheckState.Checked
二.Action过滤器实现统一验证 我们在判断验证状态时一般会在Action里判断ModelState.IsValid是否为true。 public IActionResult Create([FromBody]CreateOrderDto dto) { if(ModelState.IsValid) { context.ModelState.IsValid) { XcHttpResult result = new XcHttpResult() { Result = false }; foreach (var item in context.ModelState.Values) {
fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 6: ModelState modelState; 7: 8: //将ModelState设置为表示是否勾选布尔值 9: if (htmlHelper.ViewData.ModelState.TryGetValue (fullHtmlFieldName, out modelState)) 10: { 11: htmlHelper.ViewData.ModelState.SetModelValue = modelState) 22: { 23: htmlHelper.ViewData.ModelState[fullHtmlFieldName ] = modelState; 24: } 25: } 26: string htmlString = html.ToHtmlString
如图,用 ModelState.IsValid 这段话来对验证结果进行判定,如果实体类上的被标注的特性都满足条件的话,就为true,否则为false。 一番折腾无果,那么就不能从特性本身找突破口了,这时,我把目标转移到ModelState.IsValid上,换一种思路实现。 ? > item in actionContext.ModelState.ToArray()) { if (ia[0].Modes = actionContext.ModelState.IsValid) { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
自动模型状态验证 这个是重点,框架会帮你自动验证model的state,也就是ModelState. 他内部会检查ModelState是否为Valid,如果为InValid会直接返回400 BadRequest,这样就没有必要执行后面的代码,提高效率。 ) //判断状态 { return BadRequest(ModelState); } //其他代码。。。 Controller { [HttpPost("")] public IActionResult PostBook(Book book) { //直接写,不用验证modelstate options.InvalidModelStateResponseFactory = actionContext => { var errors = actionContext.ModelState
, JObject errors)
{
foreach (var c in ModelState.Keys)
{
if (! ModelState.IsValidField(c))
{
string errStr = "";
foreach (var err in ModelState[c].Errors)
{
errStr += err.ErrorMessage + "
"; 代码通过遍历ModelState中不能通过验证的字段,将其加入到errors对象中。 (ModelState,errors);
}
现在要考虑怎么返回这个errors对象,解决办法是在WriteJobjectResult方法加一个类型为JObject的对象,并添加以下代码:
if(errors