技术开发 频道

代码不再重复:MVC与Windows工作流集成开发

  三 基于模型状态进行客户端校验

  常规的校验方法通常是在客户端使用Javascript脚本语言来执行数据输入的验证。有时候,我们还可能需要使用JavaScript在客户端进行业务规则的验证。仅当客户端验证不可靠时,才使用服务器端验证。显然,服务器端验证是被安排在类似C#这样的服务器端语言代码实现中。这种方法存在一个明显的问题是,在一段时间内,我们很有可能需要重复地使用数据以及业务规则验证逻辑等。

  为了解决上面这样的问题,我们可以在模型中加入方法,交由它来维护和强制执行所有的验证工作。这样一来,当需要改变验证逻辑时,仅需要在模型部分执行相应的改变逻辑,但却能够自动影响到系统中所有相关内容。

  ASP.NET MVC框架提供给我们许多种方案来执行校验逻辑任务,而这些工作仅需要使用我们所熟悉的C#编码即可。这样一来,校验规则被交由HTTP请求管道进行处理,从而使我们可以在客户端向用户提供校验相关的提示信息。

  ASP.NET MVC中使用一个临时存储区,命名为“ModelState”,用于存储所有的绑定操作模式期间发生的验证错误。调用方法ModelState.IsValid可以确定模型绑定操作是否发生了任何验证错误。如果有任何错误,则此方法将返回false。另外,ASP.NET MVC框架也提供了相应的机制用于向终端用户展示ModelState中存储的错误信息。为使模型部分(即C#类)使用此功能,模型应该实现IDataErrorInfo接口。

  在我们的示例应用程序中,模型“Employee”需要实现如下的接口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;

namespace WizardTypeUITwo.Models
{
    [Serializable]
    
public class Employee : IDataErrorInfo
    {  
        
//个人信息
        public string Name { get; set; }
        
public int? Age { get; set; }
        
//职业信息
        public string CurrentEmplrName { get; set; }
        
public int? Salary { get; set; }
        
//联系信息
        public string Email { get; set; }
        
public int? Mobile { get; set; }
        
public string this[string columnName]
        {
            
get
            {
                
if ((columnName == "Name") && string.IsNullOrEmpty(Name))
                    
return "Please enter a name";
                
if ((columnName == "Age") && !Age.HasValue)
                    
return "Please enter a numeric age";

                
if ((columnName == "CurrentEmplrName") && string.IsNullOrEmpty(
                    CurrentEmplrName))
                    
return "Please enter current employer name";
                
if ((columnName == "Salary") && !Salary.HasValue)
                    
return "Please enter salary";

                
if ((columnName == "Email") && !IsValidEmailAddress(Email))
                    
return "Please enter a valid email address";
                
if ((columnName == "Mobile") && !Mobile.HasValue)
                    
return "Please enter mobile number";

                
return null;
            }
        }
        
private static bool IsValidEmailAddress(string email)
        {
            
//请根据您的具体情况进一步改进这里的逻辑
            return (email != null) && (email.IndexOf("@") > 0);
        }
        
//遵循默认编译规则
        public string Error { get { return null; } }
    }
}

  在本文雇员注册示例程序中,页面Step1.aspx对应于第一个视图。借助于HTML辅助方法,我们会及时地通知用户相应的验证错误信息。

<%= Html.ValidationSummary("Please correct the errors and try again.") %>
    
<label for="Name">Name:</label>
    
<%= Html.TextBox("Name", Model.Name) %>
    
<%= Html.ValidationMessage("Name", "*") %>

  通过在服务器端执行任何操作之前调用ModelState.IsValid方法,我们可以限制用户进入到系统注册流程中的下一个界面。在本文示例应用程序中,只有在填充适当的信息之后,才允许用户进入到下一个步(页面Step2.aspx)。

0
相关文章