【问题标题】:Ajax form, validation and errorsAjax 表单、验证和错误
【发布时间】:2013-06-08 17:22:36
【问题描述】:

所以我有一个带有验证功能的 Ajax 表单。 我的问题是我的 POST 操作:

[HttpPost]
public ActionResult AddUpdateConfigs(StorageConfigurationModel modelbind)
{
    if (ModelState.IsValid)
    {
       //blablabla more code
    }
    else
    {
        return PartialView("cbpnlNewUpdateConfigs",modelbind);
    }
}

当模型有效时,我会尝试使用这些值,例如我拥有的 UNC 路径,我需要查看该 UNC 路径是否存在,所以我这样做了:

    try
    {
        DirectoryInfo dir = new DirectoryInfo(modelbind.Location);
        if (dir.Exists)
        {
            //bla bla bla
        }
        else
        {
            return //something I dont know what
        }
    }
    catch (Exception j)
    {
        return //something I dont know what
    }

所以我不知道返回匹配Action 类型并且在客户端也有正确的消息是正确的。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    您可以将错误添加到您的ModelState

    ModelState.AddModelError(string.Empty, "Path does not exist.");
    

    这里的关键是使用string.Empty 作为keyModelState.AddModelError

    然后在View中显示:

    @Html.ValidationSummary()
    

    这样,您可以使用与模型无效时相同的视图 (!ModelState.IsValid)。

    来源: ModelState.AddModelError - How can I add an error that isn't for a property?

    【讨论】:

    • 喜欢你的解决方案,但是当我将数据添加到数据库时,我应该返回什么来表示它成功了?
    • 我想当您遇到错误时,您正在用您的响应(部分视图)填充一些 html 容器元素。好吧,当一切正常时,您可以返回不同的局部视图。
    • 可以,但我的 onSuccess 函数没有触发
    • 你检查过你得到什么样的回应吗?我的意思是200500。您可能需要在服务器端调试,看看是否一切正常。
    【解决方案2】:

    对于第一个条件,您可以使用 HttpStatusCode 枚举并使用 NotFound 常量。

    http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode.aspx

    对于异常,如果您想使用特定的 HTTP 错误响应代码,则需要准确找出异常是什么。

    否则,您可以使用 InternalServerError 来指示发生了一般服务器错误。

    希望对你有帮助

    沙赫巴兹

    【讨论】:

      【解决方案3】:

      您可以返回带有Success 属性的JsonResult 以及视图的Html 或错误Message,您可以从您的ajax 响应对象中读取:

          [HttpPost]
          public JsonResult AddUpdateConfigs(StorageConfigurationModel modelbind)
          {
              if(!allowed) {
                return Json(new { Success = false, Message = "blah blah blah"}, JsonRequestBehavior.DenyGet);
              }
              else
              {
                  return Json( new {Success = true, Html = RenderPartialView("cbpnlNewUpdateConfigs", model)}, JsonRequestBehavior.DenyGet);
              }
          }
      
          public static class PartialViewHelper
              {
                  public static string RenderPartialView(this Controller controller, string viewName, object model)
                  {
                      if (string.IsNullOrEmpty(viewName))
                          viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
      
                      controller.ViewData.Model = model;
                      using (var sw = new StringWriter())
                      {
                          ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
                          var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                          viewResult.View.Render(viewContext, sw);
      
                          return sw.GetStringBuilder().ToString();
                      }
                  }
      
                  public static string RenderView(this Controller controller, string viewName, object model)
                  {
                      if (string.IsNullOrEmpty(viewName))
                          viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
      
                      controller.ViewData.Model = model;
                      using (var sw = new StringWriter())
                      {
                          ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, String.Empty);
                          var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                          viewResult.View.Render(viewContext, sw);
      
                          return sw.GetStringBuilder().ToString();
                      }
                  }
              }
      

      【讨论】:

        【解决方案4】:

        由于是ajax调用,所以可以发送JSON格式的响应。

        if(someConditionTrue)
        {
          //Make changes to DB 
          return Json(new { Status="Success"});
        }
        else
        {
         return Json(new { Status="Error", Message="Directory not found"});
        }
        

        在您的客户端,您可以检查结果并向用户显示适当的信息。

        $.post("someValidUrl",$("#form1").serialize(),function(response){
          if(response.Status=="Error")
          {
             alert(response.Message);
          }
        });
        

        您可以在 JSON 结果中发送部分视图的标记(在成功的情况下),并使用它来替换要更新内容的 div 的 html。检查this answer 的扩展方法。

        【讨论】:

        • 那么验证呢?它不会出现
        • 您也可以在 JSON 数据中发送验证消息。
        • 你可以得到这样的验证错误stackoverflow.com/questions/15296069/…
        • 在此示例中,您将结果作为ActionResult 发送,并且您正在谈论Json
        • 您可以从返回类型为“ActionResult”的操作方法发送 JSON。您可以返回 JSON/Image/PDF/String 等...
        猜你喜欢
        • 1970-01-01
        • 2020-09-19
        • 1970-01-01
        • 2015-12-16
        • 2011-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多