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中添加验证错误,然后在客户端处理它,但我相信这已经是我的一个验证的基础.
我使用数据注释属性通过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块,并返回必要的结果以将错误消息显示回客户端.