通过jquery $ .ajax发布时的ASP.NET MVC验证框架?

Mis*_* N. 6 validation ajax asp.net-mvc jquery xval

有很多非常好的帖子和解释如何使用ASP.NET MVC实现验证,我更喜欢其中一个:

但是,我真的想通过jquery $ .ajax方法调用ActionMethods.我想使用$ .ajax的原因之一是因为会有很多部分视图通过$ .ajax调用动态地加载到页面中(甚至是实体创建的形式),我不能只返回视图 - 我将丢失所有动态加载的内容.

为了让您更好地了解问题,我将发布一些简单的代码来解释我如何在客户端jquery代码中调用控制器操作和处理响应.

控制器ActionMethod:

    public ActionResult CreateCustomer(string name, string accountNumber)
    {
        try
        {
            CustomerService.InsertCustomer(name, accountNumber);

            return Json(new ActionInfo()
            {
                Success = true,
                Message = "Customer Is Successfully Created"
            });

        }
        catch (Exception ex)
        {
            return Json(new ActionInfo()
            {
                Success = false,
                Message = ex.Message
            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

在客户端代码中调用和处理:

$.ajax({
type: "POST",
url: $form.attr('action'),// /MyController/CreateCustomer
data: $form.serialize(),
error: HandleUnespectedError,
dataType: "json",
success: function(response) {

    if (response.Success)
        alert("Success: " + response.Message);
    else
        alert("Error: " + response.Message);
}});
Run Code Online (Sandbox Code Playgroud)

是否有一种很好的方法可以使这些验证框架以我需要的方式工作?我知道我可以在ActionInfo中添加验证错误,然后在客户端处理它,但我相信这已经是我的一个验证的基础.

Jus*_*zer 5

我使用数据注释属性通过AJAX进行验证取得了很大的成功.为了检查数据的有效性,您需要使用控制器的ModelState属性,该属性具有自己的属性IsValid.我强烈建议您查看官方ASP.NET MVC站点的数据注释验证属性教程.

首先,您需要修改控制器操作以接受模型对象作为参数,而不是单独的名称和帐号.这将使执行验证(我将在下面演示)更加简单.从您的示例中,我最好的猜测是您的模型对象是或将被称为Customer.您可能有以下代码来定义模型对象和控制器操作...

// model object
public class Customer
{
  public Int32 Id {get; set;}
  public String Name {get; set;}
  public String AccountNumber {get; set;}
}

// controller
public class CustomerController : Controller
{
  public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
  {
     // controller action code
  }
}
Run Code Online (Sandbox Code Playgroud)


确保命名表单字段以匹配Customer对象的属性名称,以便ASP.NET MVC可以自动绑定它们.在这种情况下,"绑定"属性告诉ASP.NET MVC在将表单字段绑定到模型属性时忽略Customer类的"Id"属性.由于这是一个新客户,我们还没有Id,因此我们可以安全地将Id保留为默认值,并保留数据层以确定如何最好地生成它.

一旦控制器构造了动作方法的模型对象,就可以通过ModelState.IsValid属性轻松检查其有效性.正如人们所预料的那样,如果模型属性有效,它将返回true,如果1个或多个属性无效,则返回false.

从最初的问题来看,似乎该CustomerService.InsertCustomer方法在验证失败时抛出异常.这完全没必要.InsertCustomer应该只需要执行插入新记录所需的任何数据操作.除非您希望抽象实现特定的异常,例如SqlException,否则InsertCustomer不应该真正需要捕获或抛出任何异常,但很可能只是让任何异常冒泡到控制器(或调用者可能是谁).

所有这些的最终结果可能是控制器操作,如下所示:

public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
{
  // model is invalid
  if (!ModelState.IsValid)
  {
    return Json(new ActionInfo()
    {
      Success = false,
      Message = "Validation failed" // you will probably want a more robust message :-)
    });
  }

  // service method accepts a Customer object rather than arbitrary strings  
  CustomerService.InsertCustomer(customer);

  return Json(new ActionInfo()
  {
    Success = true,
    Message = "Customer created successfully."
  });

}
Run Code Online (Sandbox Code Playgroud)


如果要报告意外错误,例如数据库相关异常,那么您当然可以在对InsertCustomer的调用周围添加try/catch块,并返回必要的结果以将错误消息显示回客户端.