代码之家  ›  专栏  ›  技术社区  ›  Misha N.

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

  •  6
  • Misha N.  · 技术社区  · 16 年前

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

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

        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
                });
            }
        }
    

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

    $.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);
    }});
    

    我知道我可以在ActionInfo中添加验证错误,然后在客户端中处理它,但我相信这已经是我的一个验证的构建了。

    2 回复  |  直到 16 年前
        1
  •  5
  •   Justin Holzer    16 年前

    我使用数据注释属性通过AJAX进行验证取得了巨大的成功。为了检查数据的有效性,您需要使用控制器的 ModelState IsValid data annotations validation attributes tutorial 来自官方ASP。NET MVC网站。

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

    // 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
      }
    }
    


    一旦控制器为动作方法构建了模型对象,就可以通过以下方式轻松检查其有效性 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."
      });
    
    }
    


    如果你想报告意外错误,比如与数据库相关的异常,那么你当然可以在InsertCustomer的调用周围添加一个try/catch块,并返回必要的结果,以便向客户端显示错误消息。

        2
  •  2
  •   Robert Koritnik    15 年前

    这是在您提出问题一年多之后,但我在我的 blog post 这可能会让你很感兴趣。我看到您将失败的结果作为成功的HTTP调用返回。我处理这件事的方式不同(我想从那以后更正确了 $.ajax success error 响应功能)。你的例子是一个完美的例子,可以用我在博客文章中解释的功能来实现。

    HandleModelStateException