Ajax表单,验证和错误

时间:2013-06-12 14:32:08

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

所以我有一个带验证的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类型并且在客户端也有正确的消息是正确的。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

您可以向ModelState添加错误:

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

此处的关键是使用string.Empty作为key的{​​{1}}。

然后在视图中显示:

ModelState.AddModelError

这样您就可以使用模型无效时使用的相同视图(@Html.ValidationSummary() )。

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

答案 1 :(得分:0)

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

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

对于异常,如果要使用特定的HTTP错误响应代码,则需要确切了解异常是什么。

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

希望这有帮助

沙赫巴兹

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

由于它是一个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 answe r是否有扩展方法。