当我使用jquery post时管理serverside validaton

时间:2015-04-28 21:19:43

标签: c# .net asp.net-mvc

从razor视图我使用jquery将js对象发送到mvc控制器。我使用jquery post方法而不是razors形式的原因是我需要管理某些字段的动态输入。在视图中,某些字段(inputtextbox)被动态添加到视图中(从0到10),我使用页面上的js管理该解决方案。

private void myForm_Load(object sender, EventArgs e)
{
    DialogResult dialogOpen = MessageBox.Show("Use the navigation menu to get started.", "Welcome!", MessageBoxButtons.OK);
}

在服务器端,mvc接收该模型,如果出现某些错误,我想将此对象返回给视图。

 var myJsObj = ...
 $.ajax({
           type: 'POST',
           traditional: true,
           contentType: 'application/json',
           url: '/MyController/SomeAction',
           data: JSON.stringify({ model: myJsObj}),
           success: function () {

           }
 });

我有剃刀内部视图

[HttpPost]
public ActionResult SomeAction(MyModel model)
{
   if(!ModelState.IsValid)
   {
      ModelState.AddModelError("", "Error occured!");
      return View(model);
   }     
   return RedirectToAction("Index");  
}

但由于我正在使用jquery帖子,我不知道如何接收回到视图并显示错误,就像我会使用常规剃刀形式。或者,如果您知道在剃刀视图上管理动态添加的输入框的更好方法,请发布。请帮忙。

2 个答案:

答案 0 :(得分:1)

这是我为显示动态输入错误所做的工作。首先,看看这篇文章,让你更好地理解。我修改了我的代码以更好地满足我的需求,但您可以检查它是否适用于您的应用程序。 use-asp-net-mvc-validation-with-jquery-ajax。 然后我将在ajax post错误回调中使用返回结果。它会在验证错误时返回代码400“错误请求”。验证器变量是表单验证器对象。

error: function (xhr, textStatus, errorThrown) {
     var statusCode = parseInt(xhr.status);
     if (statusCode == 400) {
         var data = $.parseJSON(xhr.responseText);
         var message = "";
         $.each(data, function (i, item) {
             var propertyName = "" + item.key + "";
             if ($("input[name='" + item.key + "']").length > 0) {
                 var errorObj = {};
                 errorObj[item.key] = item.error;
                 validator.showErrors(errorObj);
            }
            else {
                message += "<div>" + item.key + ": " + item.error + "</div>";
            }
        });

        if (message != "") {
            //display message
         }
    }
}

我希望这会有所帮助。祝你好运。

答案 1 :(得分:1)

我想你在这里有几个选择:

  1. 如果您希望继续使用上面显示的Ajax POST,那么您需要从POST获取响应并将其重新注入当前的HTML文档。例如,
  2. $.ajax({
           type: 'POST',
           traditional: true,
           contentType: 'application/json',
           url: '/MyController/SomeAction',
           data: JSON.stringify({ model: myJsObj}),
           success: function (data) {
               // This is the case where the MVC action found model validation
               // errors, and so it is responding with an HTML document that 
               // shows the errors.
               var returnedBodyHtml = $(data).find('body').html();
               $('body').html(returnedBodyHtml);
           }
         });

    (那是未经测试的代码,因此您可能需要进行一些调试。)但是此代码不处理服务器使用重定向响应的情况(在成功验证的情况下)。因此,请查看this post以了解其中的一些选项。

    1. 您的其他选择是使用标准表单提交。我知道你说你的页面上有一些动态生成的输入控件,但这并不意味着你不能进行表单提交。您只需要确保这些动态生成的元素具有正确的“name”属性,以便它们的值适当地映射到接受POST的服务器端操作上的Model。例如,如果您的Javascript动态生成这样的HTML元素,并将其插入到表单中:
    2. <input type="text" name="myDynamicallyGeneratedInput[0]" />
      <input type="text" name="myDynamicallyGeneratedInput[1]" />
      <input type="text" name="myDynamicallyGeneratedInput[2]" />
      <input type="text" name="myDynamicallyGeneratedInput[3]" />

      然后您的表单提交仍然有效,只要在服务器端,您的MyModel类具有相应的属性:

      class MyModel
      {
          public List<string> MyDynamicallyGeneratedInput {get; set;}
      }