2016-11-14 87 views
4

我是新來的Ajax和JQuery,所以我需要你原諒我,如果我想做一些愚蠢的事情,我正在使用MVC 5和Ajax.Beginform , 和我想要做的是我有一個ajax窗體,我需要驗證它與jquery不顯眼,如果我正確使用ModelState的Jquery驗證工作,並將返回視圖,如果是一個驗證錯誤發現,在這種情況下,我需要所以出現在瀏覽器用戶的確認消息,例如這裏更新我的形式是我的控制器:Ajax.BeginForm處理兩個不同的onSuccess響應,MVC 5,C#

[HttpPost] 
public ActionResult Index(AddProduct model) 
{ 
    if (ModelState.IsValid) 
    { 
     // connect to the database save data etc... 
     return PartialView("~/Views/Shared/_MyModal.cshtml"); 
    } 
    else 
    { 
     return View(model); 
    } 
} 

如果ModelState.IsValid我應該保存的數據,並返回局部視圖(Bootstrap Modal)指示數據已成功保存,否則它將返回整個視圖以顯示驗證消息,並要做到這一點,我必須將ajax表單的TargetId包裝爲更新的整個ajax表單, 這裏的AJAX形式:

<div id="result"> 
@using (Ajax.BeginForm("Index", new AjaxOptions 
    { 
     InsertionMode = InsertionMode.Replace, 
     UpdateTargetId = "result", 
     HttpMethod = "POST", 
     OnBegin = "onBegin();", 
     OnComplete = "onCompleated();", 
     OnSuccess = "onSuccess()", 
     OnFailure = "onFailure()" 
})) 
{ 
@Html.ValidationSummary(true) 
<div id="form1" class="form-horizontal"> 
    <div class="row"> 
     <div class="form-group"> 
      @Html.LabelFor(m => m.Name, new { @class = "col-md-2 control-label" }) 
      <div class="col-md-10"> 
       @Html.TextBoxFor(m => m.Name, new { @class = "form-control"  }) 
       @Html.ValidationMessageFor(m => m.Name, String.Empty, new { @class = "text-danger" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      @Html.LabelFor(m => m.Price, new { @class = "col-md-2 control-label" }) 
      <div class="col-md-10"> 
       @Html.TextBoxFor(m => m.Price, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(m => m.Price, String.Empty, new { @class = "form-help form-help-msg text-red" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <button class="btn btn-default col-md-2 col-md-offset-2" type="submit">Save &nbsp;&nbsp;</button> 
     </div> 
    </div> 
</div> 
} 
    </div> 

否則我會返回一個局部視圖,並顯示爲引導模態,我需要在這種情況下,不更新Ajax表單目標ID我需要保持它的完整和公正的顯示莫塔爾,但問題是在這兩種情況下的ModelState.IsValid或不是有效的所有響應fires onSuccess方法在Ajax形式我不知道這些是正常與否,這裏是JavaScript onsuccess()方法:

function onSuccess() { 
    $('#myModal').modal('hide') 
    $("#resultModal").modal({ 
     backdrop: 'static', 
     keyboard: false 
    }); 
    $('#resultModal').on('hidden.bs.modal', function (e) { 
     window.location = "/product"; 
    }); 
} 

$(#「myModal」)模態(「隱藏」)是一種進步莫代爾我隱藏它的發佈具有完成後,接下來的步驟是我顯示結果莫代爾,我曾當過帳返回它沒有驗證錯誤執行罰款, 問題是:

  • 我得到更新在阿賈克斯的形式就好了,如果驗證錯誤恰好是存在使用UpdatetargetId的形式,但這是發生什麼辦法,如果我回國驗證錯誤或部分視圖,關心莫代爾對我來說,在兩種情況下形式消失,這是我不會做的事情, 我需要保持形式以防r eturn內容是部分視圖和更新情況ModelStat驗證錯誤,也許我想念瞭解一切,但如果我是,我需要一些解釋讓我回到正軌。

  • 我做了一個醜陋的代碼和凌亂,我不喜歡在onSuccess()Mehtod如上所述,我用事件火災時,當我關閉我的結果莫代爾重定向我再次索引,所以窗體顯示再次,但它不乾淨,我不喜歡它,如果存在,我需要一些專業。

謝謝你在前進,

+0

嘿,你檢查了我的解決方案嗎? – MDDDC

+0

對不起,遲到了,是的,我確實檢查了它,並且對你說實話,我發現有近三篇文章談論渲染局部視圖,這是我第一次考慮,因爲你的先生你的解決方案對我來說很方便,並且激勵我要做更多的事情,我即將嘗試,但我認爲它會對我很好,謝謝你先生你的答案是夠好,但我認爲你發佈的控制器中有一些代碼錯誤,檢查以便任何人都可以獲得幫助從它,再次感謝您先生.. –

+0

謝謝先生,它作爲一種魅力^ _ ^! 我花了長期應用它,我有這麼多用它做,它的工作就好了再次感謝你.. 如果碰巧發現更專業增強這一解決方案,請更新您的答案, –

回答

2

我完全理解你的問題,我很願意告訴你,我用來處理這種情況的方法。

因此,因爲如果ModelState有效或無效,每次都調用onSuccess方法,您將需要處理響應有點不同。 所以你的[HttpPost]的方法應該是這樣的:

[HttpPost] 
     public ActionResult Index(AddProduct model) 
     { 
      if (ModelState.IsValid) 

      { 
       return Json(new {isValid = true, data = this.RenderPartialViewToString("ViewWhenModelStasteIsValid",model,false)}); 
      } 
      else 
      { 
       return Json(new { isValid = false, data = this.RenderPartialViewToString("ViewWhenModelStasteIsNotValid", model, false) }); 
      } 
     } 

public static string RenderPartialViewToString(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()) 
      { 
       var 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(); 
      } 
     } 

在您需要從表單起飛UpdateTargetId和手動處理它成功函數的觀點。

所以,你的onSuccess函數應該是這樣的

function onSuccess(result, ref) { 
     if (result.isValid) { 
      jQuery("#result).html(result.data); 
      } else { 
      jQuery("#form1").html(result.data); 
     } 
    } 

確保傳遞的響應數據的onSuccess功能,所以你需要在表格上改變從的onSuccess =「的onSuccess()」OnSuccess =「onSuccess(data,this)」

所以你的形式看起來就像這樣:

@using (Ajax.BeginForm("Index", new AjaxOptions 
    { 
InsertionMode = InsertionMode.Replace, 
HttpMethod = "POST", 
OnBegin = "onBegin();", 
OnComplete = "onCompleated();", 
OnSuccess = "onSuccess(data,this)", 
OnFailure = "onFailure()" 
})) 

希望這是你所需要的。

+0

感謝的人我是試試這個答案非常高興。有一個美好的一天先生是非常有益的! –

相關問題