您的位置:首页 > 编程语言 > ASP

ASP.NET MVC:使用Enterprise Library验证程序块进行验证对象

2010-01-16 23:52 666 查看
原文链接:http://weblogs.asp.net/gunnarpeipman/archive/2009/11/13/asp-net-mvc-validating-objects-using-enterprise-library-validation-application-block.aspx

在应用程序中数据的验证是一个重要的话题。在进行数据验证的时候有许多令你满意的验证框架。目前我使用Enterprise Library 4.1中的验证程序块并且我把它集成到ASP.NET MVC应用中。在这个案例中我会展示如何在ASP.NET MVC中使用验证程序块。

简介
很快,你可以为你的ASP.NET MVC视图创建和初始化对象。我想你知道知道这个功能,请先知道它的基本工作原理。
下面是我的应用程序如何分层。



目前,所有外部的东西,是被基础层引用。基础层提供了依赖注入和验证的共同接口。当实现改变时这些接口也不会改变。表示层使用基础实现。
添加验证
我需要将Enterprise Library 4.1下载并安装到我的开发机器上。如果你想测试我的解决方案,你也可以创建一个ASP.NET MVC网站应用项目并且将所有东西添加进来。所有东西都没问题。在安装Enterprise Library后你需要添加一些引用让你的程序能使用验证程序块。找到这三个文件:
Microsoft.Practices.EnterpriseLibrary.Common.dll
Microsoft.Practices.EnterpriseLibrary.Validation.dll
Microsoft.Practices.EnterpriseLibrary.Validation.Configuration.Design.dll
这个库就足够了。将这些引用添加到基础库当中。
接下来我们需要为我们的验证功能添加一个虚构的测试。我创建了三个类:

ValidationError – 代表一个验证错误,并包含无效的属性名称和验证消息属性。

ValidationException – 异常的类型,它包含一系列的验证错误(它也可以检测验证代码中造成的错误)。

Validator – 这个类只有一个方法叫做验证<T>的,它使所有操作像正常运行一样。

让我们看看现在这些类。
ValidationError

public class ValidationError
{
    public string PropertyName { get; set; }
    public string Message { get; set; }
}


ValidationException

public class ValidationException : Exception
{
    private readonly ValidationError[] _errors;
    public ValidationException(ValidationError[] errors)
    {
        _errors = errors;
    }
    public ValidationError[] ValidationErrors
    {
        get
        {
            return _errors;
        }
    }
}


Validator

public static class Validator
{
    public static ValidationError[] Validate<T>(T instance)
    {
        var errors = new List<ValidationError>();
        var results = Validation.Validate<T>(instance);
        foreach (var result in results)
        {
            var error = new ValidationError();
            error.PropertyName = result.Key;
            error.Message = result.Message;
            errors.Add(error);
        }
        return errors.ToArray();
    }
}


现在我们正在接近完成,现在添加一些规则。
添加验证规则
请确保在你的应用程序中有web.config文件,我们将要修改这个文件。从程序菜单中运行Enterprise Library配置程序然后打开web.config文件。



添加一些验证规则类并保存配置。Enterprise Library会自动为你的web.config文件添加所有必需的部分。

<h2>Insert</h2>
<%= Html.ValidationMessage("_FORM") %>
<% using (Html.BeginForm()) {%>
  <fieldset>
  <legend>New price enquiry</legend>
  <table>
    <tr>
      <td valign="top"><label for="Title">Title</label>:</td>
      <td valign="top">
        <%= Html.TextBox("Title") %><br />
        <%= Html.ValidationMessage("Title")%>
      </td>
    </tr>
    <tr>
      <td valign="top">
        <label for="From">From</label>:
      </td>
      <td valign="top">
        <%= Html.TextBox("From") %><br />
        <%= Html.ValidationMessage("From")%>
      </td>
    </tr>
    <tr>
      <td valign="top"><label for="DocNumber">Number</label>:</td>
      <td valign="top">
        <%= Html.TextBox("DocNumber") %><br />
        <%= Html.ValidationMessage("DocNumber") %>
      </td>
    </tr>
    <tr>
      <td valign="top"><label for="Date">Date:</label>:</td>
      <td valign="top">
        <%= Html.TextBox("Date", DateTime.Now.ToShortDateString()) %><br />
        <%= Html.ValidationMessage("Date") %>
      </td>
    </tr>
    <tr>
      <td valign="top">
        <label for="DueName">Due date:</label>:
      </td>
      <td valign="top">
        <%= Html.TextBox("DueDate", DateTime.Now.ToShortDateString()) %><br />
        <%= Html.ValidationMessage("DueDate") %>
      </td>
    </tr>
  </table>
  <p>
    <input type="submit" value="Save" />
  </p>
</fieldset>


让我们看到一个库的方法,接受对象进行验证。假设我们已经保存了库,保存之前验证他们的对象。如果有验证错误ValidationException将被抛出。这里是简化保存库的方法。

public void SavePriceEnquiry(PriceEnquiry instance)
{
    var results = Validator.Validate<PriceEnquiry>(instance);
    if (results.Length > 0)
        throw new ValidationException(results);
    Save<PriceEnquiry>(instance);
}


而且,我们在ASP.NET MVC控制器中使用这个库(如果您的ASP.NET MVC的版本不支持HttpPost属性您可以使用AcceptVerbs(HttpVerbs.Post)代替)。

[HttpPost]
public ActionResult Insert(PriceEnquiry enquiry)
{
    try
    {
        _repository.SavePriceEnquiry(enquiry);
    }
    catch (ValidationException vex)
    {
        Helper.BindErrorsToModel(vex.ValidationErrors, ModelState);
        return Insert();
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("_FORM", ex.ToString());
        return Insert();
    }
    return RedirectToAction("Index");
}


你可以看到调用方法叫做BindErrorsToModel()。这是辅助方法,通过一系列的验证错误数组与绑定错误相结合。如果你喜欢,您可以在自己的项目使用这个方法。

public static class Helper
{
    public static void BindErrorsToModel(ValidationException exception, ModelStateDictionary modelState)
    {
        BindErrorsToModel(exception.ValidationErrors, modelState);
    } 
    public static void BindErrorsToModel(ValidationError[] errors, ModelStateDictionary modelState)
    {
        if (errors == null)
            return;
        if (errors.Length == 0)
            return;
        foreach (var error in errors)
            modelState.AddModelError(error.PropertyName, error.Message);
    }
}


注意:请不要忘记,在你的表示层中的字段必须和类中名字命名相同。
现在您可以测试您的应用程序,看看是否进行验证工作。如果代码或配置没有错误,您应该看到正确的错误提示。

结论
虽然这个例子有点长,但不难将验证支持添加到您的应用程序。如果您是第一次将会你花费一些时间,但如果你熟悉的工具,一切会很顺利快速。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: