一起谈.NET技术,ASP.NET MVC中对Model进行分步验证的解决方法

简介:   在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个Model的信息,但是又分页面填写信息的,当时我加上ModelState.IsValid这句验证代码的时候,根本没法通过验证,因为在注册的前面三步,注册用户的Model信息都没填写完整,而ModelState.IsValid是对一个实体的所有属性进行判断验证的。

  在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个Model的信息,但是又分页面填写信息的,当时我加上ModelState.IsValid这句验证代码的时候,根本没法通过验证,因为在注册的前面三步,注册用户的Model信息都没填写完整,而ModelState.IsValid是对一个实体的所有属性进行判断验证的。当时很纠结,因为刚接触Asp.net MVC,故没有找到解决方案。这篇文章将给出解决的办法。看下面需要验证的Model的代码如下:

代码
 
  
public class UserViewModel
{
[DisplayName(
" step " )]
[Required(ErrorMessage
= " You must select a step . " )]
public int Step { get ; set ; }
// 个人信息
[Required(ErrorMessage = " 姓名不能为空 " )]
[StringLength(
20 , ErrorMessage = " 姓名长度不能超过20个字符 " )]
public string Name { get ; set ; }

[RegularExpression(
@" 120|((1[0-1]|\d)?\d) " , ErrorMessage = " 年龄格式不对 " )]
public int ? Age { get ; set ; }

// 职位信息
[Required(ErrorMessage = " 职位不能为空 " )]
public string Post { get ; set ; }
public int ? Salary { get ; set ; }

// 学历信息
[Required(ErrorMessage = " 毕业院校不能为空 " )]
public string University { get ; set ; }
public int ? GraduationYear { get ; set ; }

// 联系信息
[Required(ErrorMessage = " 邮件不能为空 " )]
[RegularExpression(
@" ^[a-z][a-z|0-9|]*([_][a-z|0-9]+)*([.][a-z| " + @" 0-9]+([_][a-z|0-9]+)*)?@[a-z][a-z|0-9|]*\.([a-z] " + @" [a-z|0-9]*(\.[a-z][a-z|0-9]*)?)$ " , ErrorMessage = " 邮件格式不正确 " )]
public string Email { get ; set ; }
public int ? Mobile { get ; set ; }

public IEnumerable < SelectListItem > StepList { get ; set ; }

public UserViewModel()
{
var list
= new List < SelectListItem > () {
new SelectListItem { Text = " (Select) " },
new SelectListItem { Value = " 1 " , Text = " Step1 " },
new SelectListItem { Value = " 2 " , Text = " Step2 " },
new SelectListItem { Value = " 3 " , Text = " Step3 " },
new SelectListItem { Value = " 4 " , Text = " Step4 " }
};
this .StepList = new SelectList(list, " Value " , " Text " );
}


}

  实现:

  这篇文章这种情况服务端和客户端的验证都会讲到。为了简化起见,这里我除去的WF的流程功能,直接用下拉框表示,当下拉框选择step1表示填写第一步注册的信息,当下拉框选择step2表示填写第二步注册的信息,当下拉框选择step3表示填写第三步注册的信息,当下拉框选择step4表示填写第四步注册的信息。写得很啰嗦,但是这个很容易实现,我使用Jquery来显示和隐藏下拉框对应的Step。Jquery代码如下:

 
 
< script type = " text/javascript " >
$(
function () {
$.fn.enable
= function () {
return this .show().removeAttr( " disabled " );
}

$.fn.disable
= function () {
return this .hide().attr( " disabled " , " disabled " );
}
var dllStep = $( " #Step " );
var step1 = $( " #Step1,#Step1 input " );
var step2 = $( " #Step2,#Step2 input " );
var step3 = $( " #Step3,#Step3 input " );
var step4 = $( " #Step4,#Step4 input " );
setControls();

dllStep.change(
function () {
setControls();
});

function setControls() {
switch (dllStep.val()) {
case " 1 " :
step1.enable();
step2.disable();
step3.disable();
step4.disable();
break ;
case " 2 " :
step1.disable();
step2.enable();
step3.disable();
step4.disable();
break ;
case " 3 " :
step1.disable();
step2.disable();
step3.enable();
step4.disable();
break ;
case " 4 " :
step1.disable();
step2.disable();
step3.disable();
step4.enable();
break ;
case "" :
step1.disable();
step2.disable();
step3.disable();
step4.disable();
break ;
}
}
});
< / script>

  如下图:

  第一步:填写姓名和年龄。

   第二步:填写职位和薪水。

   第三步填写:毕业院校和毕业时间。

  第四步填写:邮箱和电话。

  为了实现这样的验证,我们可以将验证的错误信息中移除不在当前步骤填写的字段的错误信息,写一个类InputValidationModelBinder继承DefaultModelBinder并重载OnModelUpdated方法,将不必要的错误信息清除,代码如下:

 
 
public class InputValidationModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var modelState
= controllerContext.Controller.ViewData.ModelState;
var valueProvider
= controllerContext.Controller.ValueProvider;

var keysWithNoIncomingValue
= modelState.Keys.Where(x => ! valueProvider.ContainsPrefix(x));
foreach (var key in keysWithNoIncomingValue)
modelState[key].Errors.Clear();
}
}

  上面是服务端的代码,对于客户端,我们都知道asp.net MVC客户端验证时通过MicrosoftMvcValidation.js去实现的。看下面代码。

 
 
1 validate: function Sys_Mvc_FormContext$validate(eventName) {
2 var fields = this .fields;
3 var errors = [];
4 for ( var i = 0 ; i < fields.length; i ++ ) {
5 var field = fields[i];
6 if ( ! field.elements[ 0 ].disabled) {
7 var thisErrors = field.validate(eventName);
8 if (thisErrors) {
9 Array.addRange(errors, thisErrors);
10 }
11 }
12 }
13 if ( this .replaceValidationSummary) {
14 this .clearErrors();
15 this .addErrors(errors);
16 }
17 return errors;
18 }
19 }

  在第6行代码加入了一句判断:当页面的元素没有被disabled的时候才去验证。好了这样就实现了一次只对Model中的几个属性字段进行验证。

  运行:

  asp.net mvc的验证机制只对model中当前页面的属性进行验证:

  填写正确通过验证:

  总结:本文解决了我之前遗留下来的一个问题。实现了在ASP.NET MVC中对Model进行多步验证。希望对你有所帮助,如果你有更好的方法,欢迎给我留言。 

目录
相关文章
|
5月前
|
编解码 数据安全/隐私保护
.Net PdfiumViewer 打印时无法渲染电子签名问题的解决方法
【10月更文挑战第14天】这段内容介绍了使用 PdfiumViewer 库处理 PDF 文件时遇到电子签名无法打印的问题及其解决方法。首先分析了 PdfiumViewer 默认设置或对电子签名支持不足可能导致此问题,建议更新库版本并通过 NuGet 包管理器进行升级。接着检查打印机设置和驱动程序,确保设置正确且驱动为最新版本。然后优化自定义打印代码,提高渲染分辨率,确保电子签名正确加载。最后,验证 PDF 文件格式和兼容性,必要时联系技术支持或求助技术社区。
249 2
|
6月前
|
开发框架 前端开发 .NET
VB.NET中如何利用ASP.NET进行Web开发
在VB.NET中利用ASP.NET进行Web开发是一个常见的做法,特别是在需要构建动态、交互式Web应用程序时。ASP.NET是一个由微软开发的开源Web应用程序框架,它允许开发者使用多种编程语言(包括VB.NET)来创建Web应用程序。
149 6
|
6月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
102 7
|
7月前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
107 1
|
7月前
|
前端开发 JavaScript
MVC中简单数据模型(M): Model类
MVC中简单数据模型(M): Model类
|
8月前
|
开发框架 搜索推荐 前端开发
【.NET全栈】ASP.NET开发Web应用——Web部件技术
【.NET全栈】ASP.NET开发Web应用——Web部件技术
|
7月前
|
开发框架 前端开发 JavaScript
【Azure App Service】.NET应用读取静态文件时遇见了404错误的解决方法
【Azure App Service】.NET应用读取静态文件时遇见了404错误的解决方法
|
7月前
|
开发框架 .NET 开发工具
【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
|
7月前
|
开发框架 .NET 数据库连接
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
115 0
|
9月前
|
JSON JavaScript 前端开发
技术经验分享:ExtJS4MVC架构讲解
技术经验分享:ExtJS4MVC架构讲解
56 0

热门文章

最新文章