2013-06-12 37 views
1

所以我有一個帶驗證的Ajax表單,它可以工作。 我的問題是我的POST操作:Ajax表單,驗證和錯誤

[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型,也有在客戶端正確的消息。

任何想法?

回答

2

您可以添加一個錯誤您ModelState

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

的這裏關鍵是使用string.EmptykeyModelState.AddModelError

然後在視圖中顯示它:

@Html.ValidationSummary() 

這樣你就可以使用,當你的模型是無效的(!ModelState.IsValid)你使用了同樣的看法。

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

+0

與您的解決方案一樣,但是當我將數據添加到數據庫時,那麼我應該返回說它是成功的? – AAlferez

+0

我想你有錯誤時填寫一些html容器元素與你的迴應(部分視圖)。那麼當一切正常時,你可以返回一個不同的局部視圖。 – polkduran

+0

我這樣做了,但是我的onSuccess功能沒有觸發 – AAlferez

0

對於第一種情況,您可以使用HttpStatusCode枚舉並使用NotFound常量。

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

對於你需要找出異常到底是什麼,如果你想使用特定的HTTP錯誤響應代碼例外。

否則,您可以使用InternalServerError指示發生了一般服務器錯誤。

希望這有助於

沙巴茲·

0

你可以用Success屬性返回JsonResult,要麼視圖或錯誤Message,你可以從你的Ajax響應對象讀取的Html

[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(); 
       } 
      } 
     } 
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是一個擴展方法。

+0

驗證呢?它不會出現 – AAlferez

+0

您也可以在JSON數據中發送驗證消息。 – Shyju

+0

你可以得到像這樣的驗證錯誤http://stackoverflow.com/questions/15296069/how-to-figure-out-which-key-of-modelstate-has-error/15296109#15296109 – Shyju