2016-11-14 70 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

感谢的人我是试试这个答案非常高兴。有一个美好的一天先生是非常有益的! –

相关问题