Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理两个不同的onSuccess响应,MVC 5,C#_Javascript_Jquery_Ajax_Twitter Bootstrap_Asp.net Mvc 5 - Fatal编程技术网

Javascript 处理两个不同的onSuccess响应,MVC 5,C#

Javascript 处理两个不同的onSuccess响应,MVC 5,C#,javascript,jquery,ajax,twitter-bootstrap,asp.net-mvc-5,Javascript,Jquery,Ajax,Twitter Bootstrap,Asp.net Mvc 5,我不熟悉Ajax和Jquery,所以如果我试图做一些愚蠢的事情,我需要你原谅我, 我正在使用MVC5和Ajax.begin, 我要做的是,我有一个ajax表单,我需要用jquery进行验证,如果我做对了,jquery验证将与ModelState一起工作,如果发现验证错误,将再次返回视图,在这种情况下,我需要更新表单,以便验证消息显示在用户浏览器上,例如,这里是我的控制器: [HttpPost] public ActionResult Index(AddProduct model) { i

我不熟悉Ajax和Jquery,所以如果我试图做一些愚蠢的事情,我需要你原谅我, 我正在使用MVC5和Ajax.begin, 我要做的是,我有一个ajax表单,我需要用jquery进行验证,如果我做对了,jquery验证将与ModelState一起工作,如果发现验证错误,将再次返回视图,在这种情况下,我需要更新表单,以便验证消息显示在用户浏览器上,例如,这里是我的控制器:

[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,我应该保存数据并返回部分视图(引导模式),指示数据已成功保存, 否则它将返回整个视图以显示验证消息,为此,我必须将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>
$(#'myModal')。modal('hide')是一种进度模式,我会在发布完成后将其隐藏,下一步是显示结果模式,如果发布执行良好且没有验证错误,我会返回结果模式, 问题是:

  • 如果验证错误碰巧存在,我可以在ajax表单中使用UpdatetargetId来更新表单,但如果我返回验证错误或部分视图,而这些视图关心我的模态,那么在这两种情况下表单都会消失,而这是我不愿意做的事情, 我需要保留表单,以防返回内容被部分查看,并在ModelStat验证错误时更新,可能我不理解所有内容,但如果我理解了,我需要一些解释,以使我回到正轨

  • 我做了一个丑陋的代码和混乱,我不喜欢在onSuccess()方法中,如上所述,当我关闭我的结果时,我使用了事件触发模式,再次重定向我到索引,所以表单再次显示,但它不干净,我不喜欢它,我需要一些专业的东西,如果存在的话


提前感谢您,

我完全理解您的问题,并准备向您展示我处理此案件的方法

因此,由于onSuccess方法每次都被调用,而不取决于ModelState是否有效,因此您需要处理稍微不同的响应。 因此您的[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();
            }
        }
@using (Ajax.BeginForm("Index", new AjaxOptions
  {
InsertionMode = InsertionMode.Replace,
HttpMethod = "POST",
OnBegin = "onBegin();",
OnComplete = "onCompleated();",
OnSuccess = "onSuccess(data,this)",
OnFailure = "onFailure()"
 }))
在视图中,您需要从表单中去掉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(数据,此)”

因此,您的表单将如下所示:

 [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();
            }
        }
@using (Ajax.BeginForm("Index", new AjaxOptions
  {
InsertionMode = InsertionMode.Replace,
HttpMethod = "POST",
OnBegin = "onBegin();",
OnComplete = "onCompleated();",
OnSuccess = "onSuccess(data,this)",
OnFailure = "onFailure()"
 }))

希望这就是您所需要的。

嘿,您检查过我的解决方案了吗?很抱歉迟到了,是的,我检查过了,老实说,我找到了近三篇关于渲染局部视图的文章。这是我第一次考虑,因为您的解决方案对我很方便,并激励我做更多的事情,我正准备尝试,但我认为它对我来说很好谢谢先生你的回答足够好,但我认为你发布的控制器中有一些代码错误,请检查,以便任何人都可以从中获得帮助,再次感谢先生..谢谢你先生,它是一种魅力^ ^!我花了很长时间才应用它,我和它有很多关系,而且它工作得很好。再次感谢你。。如果碰巧发现这个解决方案有更专业的改进,请更新你的答案,谢谢你,我很高兴尝试一下这个答案。非常有帮助,祝您愉快,先生!!