1

所以我有一个带有验证的 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

4 回答 4

2

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

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

这里的关键是string.Empty用作keyfor ModelState.AddModelError

然后在视图中显示:

@Html.ValidationSummary()

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

来源: ModelState.AddModelError - 如何添加不属于属性的错误?

于 2013-06-12T14:41:59.203 回答
0

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

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

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

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

希望这可以帮助

沙赫巴兹

于 2013-06-12T14:38:16.130 回答
0

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

    [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();
                }
            }
        }
于 2013-06-12T14:43:07.063 回答
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。检查此答案以获取执行此操作的扩展方法。

于 2013-06-12T14:43:55.567 回答