Ajax表单、验证和错误

本文关键字:错误 验证 表单 Ajax | 更新日期: 2023-09-27 18:18:16

所以我有一个Ajax表单与验证,这是有效的。我的问题是我的POST Action:

[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类型,并且在客户端也有适当的消息。

任何想法?

Ajax表单、验证和错误

您可以在您的ModelState中添加一个错误:

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

这里的关键是使用string.Empty作为ModelState.AddModelErrorkey

然后显示在视图中:

@Html.ValidationSummary()

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

来源:模型状态。AddModelError -我如何为属性添加一个不存在的错误?

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

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

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

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

希望有帮助

夏巴兹

您可以返回具有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();
                }
            }
        }

由于是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。