所以我有一个带验证的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
类型并且在客户端也有正确的消息是正确的。
有什么想法吗?
答案 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是否有扩展方法。