Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过jquery$.ajax发布时的ASP.NET MVC验证框架?_Jquery_Asp.net Mvc_Ajax_Validation_Xval - Fatal编程技术网

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

通过jquery$.ajax发布时的ASP.NET MVC验证框架?,jquery,asp.net-mvc,ajax,validation,xval,Jquery,Asp.net Mvc,Ajax,Validation,Xval,关于如何使用ASP.NET MVC实现验证,有很多非常好的帖子和解释,我更喜欢其中一个: 但是,我非常喜欢通过jquery$.ajax方法调用ActionMethods。我想使用$.ajax的原因之一是,通过$.ajax调用将有大量的局部视图动态加载到页面中(甚至是实体创建的表单),我不能只返回视图-我将丢失所有动态加载的内容 为了让您更好地了解这个问题,我将发布一些简单的代码来解释如何在客户端jquery代码中调用控制器操作和处理响应 控制器操作方法: public Acti

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

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

为了让您更好地了解这个问题,我将发布一些简单的代码来解释如何在客户端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中添加验证错误,然后在客户端处理,但这已经是我的一个验证的构建,我相信。

我已经通过AJAX使用数据注释属性成功地进行了验证。为了检查数据的有效性,您需要使用控制器的
ModelState
属性,它有一个自己的属性,名为
IsValid
。我强烈建议您浏览一下ASP.NETMVC官方网站上的

首先,您需要修改控制器操作以接受模型对象作为参数,而不是单独的名称和帐号。这将使执行验证(我将在下面演示)变得更加简单。从您的示例中,我的最佳猜测是您的模型对象是或将是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
  }
}

确保表单字段的名称与客户对象属性的名称相匹配,以便ASP.NET MVC能够自动绑定它们。在本例中,“Bind”属性告诉ASP.NET MVC在将表单字段绑定到模型属性时忽略Customer类的“Id”属性。因为这是一个新客户,我们还没有Id,所以我们可以安全地将Id保留为默认值,并让数据层来确定如何最好地生成它

一旦控制器为动作方法构建了模型对象,就可以通过
ModelState.IsValid
属性轻松检查其有效性。正如人们所料,如果模型属性有效,它将返回true;如果一个或多个属性无效,它将返回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块,并将显示错误消息所需的结果返回给客户端。

这是在您提出问题一年多之后,但在我的文章中,我已经介绍了服务器端验证和Ajax调用,您可能对此非常感兴趣。我看到您将失败的结果作为成功的HTTP调用返回。我的处理方式有所不同(我想这更正确,因为
$。ajax
具有
成功
错误
响应功能)。你的例子是一个完美的例子,可以用我在博客文章中解释的功能来实现


基本上,我不是总是返回一个成功的响应(但是属性设置为告诉客户机服务器端处理失败),而是在服务器上抛出一个exeception,并在客户机上相应地处理它。我正在使用一个定制的ModelStateException类和一个
HandleModelStateException
action过滤器。

Hey thedude!非常感谢您的努力:)我完全同意您对客户实体进行绑定(想要这样做,不知道为什么我要使用简单参数的方法)和异常处理的看法。有了xVal,我可以轻松地实现客户机验证,如果有人避免,我将在行动中抓住它。但是在这种情况下,我如何在字段旁边显示验证消息呢?为此,您希望从控制器操作返回部分视图,而不是JSON。在局部视图中,可以使用Html.ValidationMessage()助手方法为每个字段显示错误消息。由数据注释属性生成的字段级错误消息可通过
ModelState
属性供控制器使用。例如,要获取名为name的字段的第一条错误消息,可以通过
ModelState[“name”]。错误[0]。错误消息
。另外,看看
Ajax.BeginForm
方法。我在过去使用它非常成功。这就是我意识到的,要么我将返回JSON要么部分视图,这是我不喜欢的事情。。。不过,我会看看如何使用MS内置的Ajax功能来处理它,尽管我的愿望是避免:)谢谢,我不知道你为什么希望避免它,但我相信你有你的理由。我将证明,在局部视图中使用
Ajax.BeginForm
对我来说效果很好。我相信它是在幕后使用JQuery,尽管我可能在这一点上弄错了。