1

这显然是一个老生常谈的话题,但仔细阅读以前的帖子,我无法想出一个解决方案。希望有人能告诉我这样做的“正确方法”,因为我需要做很多事情。

主要问题:当 Ajax.Beginform post ModelState 无效时,仍然会触发 OnSuccess 方法。我知道这是正确的行为,但我的 OnSuccess 方法仅在(去图)发布“成功”时才有意义。

在这种情况下,如何最好地管理带有验证错误的重新显示表单?如何从控制器返回 success=false 以及要重新显示的视图?

它与这个问题并没有特别相关,但是我在这里所做的有点类似于尝试在 Bootstrap Modal 中显示一个表单,我放弃了。

1)通过ajax调用控制器在div中加载表单。

$(function addpaneevent() {
    $('.addpane').on("click", function () {
        var url = '/QuizPane/QuickPane?quizId=' + $(this).data("quizid");
        $.ajax({
            url: url,
            type: 'GET',
            contentType: 'application/json',
            success: function (result) {
                $('#overlay').html(result);
            },
            error: function (result) {
                console.log("bummer",result);
            }
        });
    });
});

2) 返回包含表单的部分视图

public ActionResult QuickPane(int quizId)
{
    var model = *querytogetmodel*
    return PartialView("QuickPane",model);
}


@using (Ajax.BeginForm("QuickPane", "QuizPane", FormMethod.Post,
    new AjaxOptions
    {
                            InsertionMode = InsertionMode.Replace,
                            HttpMethod = "POST",
                            OnSuccess = "updatePaneList(data)",
                            OnFailure = "massivefail(data)",
    }))
{
   @Html.ValidationSummary(true)

    <fieldset>
        @Html.HiddenFor(model => model.QuizID)
        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Title, new { @autofocus = "autofocus" })
            @Html.ValidationMessageFor(model => model.Title)
        </div>
        ...more of the same
        <input type="submit" value="Create" class="btn btn-primary"/>
    </fieldset>
}

3) 在提交电话后

[HttpPost]
public ActionResult QuickPane(QuizPane quizpane)
{
    if (ModelState.IsValid)
    {
        db.QuizPanes.Add(quizpane);
        db.SaveChanges();
         return PartialView("_quizpanelist", quizpane);
    }
    return View(quizpane); //tried a few different things here
 }

4)成功后,我将新记录添加到表中并删除包含输入表单的 div。

function updatePaneList(data) {
    $("#overlay").remove();
    var rowcount = $(".expanded #panetable tr:last").count;
    $('.expanded #panetable  tbody:last').append(data);        
};
4

4 回答 4

4

我通过执行以下操作解决了这个问题......虽然我不知道这是否是处理它的建议方法。此外,您应该在这两种情况下都返回部分视图。

在返回局部视图之前添加以下行

Response.AppendHeader("X-Error", "true")

然后在你的 javascript onsuccess

function doOnSuccess(data, status, xhr) {
   if (xhr.getResponseHeader('X-Error')) {
      //validation error occurred
   }
   else
   {
      //validation error did not occur
   }
}
于 2013-12-27T20:19:09.380 回答
0

我不会使用 Ajax.BeginForm,而是使用普通表单并为此使用 ajax 调用。

$(document).on('click', '.btn-primary', function(){
    $.ajax({
        url: '@Url.Action('QuickPane', 'QuizPane')',
        type: 'post',
        data: {
            Title: $('#Title').val()
        }
        success: function(result){
            //Do Something
        }
        error: function(result){
            //Display error
        }
    });
});

然后在您的控制器中返回 JSON 而不是局部视图,您可以设置错误,例如从 ASP.NET MVC 中返回 Json 错误或像ExtJS 一样成功:如何使用 asp.net mvc 返回 json 成功 w/数据 希望这会有所帮助。

于 2013-10-28T19:24:41.060 回答
0

只需在结果成功时使用 if/else

       $("#SaveStudentRecord").click(function () {
            var data = $("#SubmitForm").serialize();  
            $.ajax({
                method: "POST",
                url: '@(Url.Action("EditAdd", "Ucesnik"))',
                data: data,
                success: function (result) {
                    if (result.success) {
                        alert("Success!..");
                        window.location.href = "/Ucesnik/GetUcesnici";
                        $("#MyModal").modal("hide");
                    }
                    else {
                        alert("Not successful");
                    }
                }
            })
        })
于 2020-03-02T07:57:51.543 回答
0

那是因为OnSuccessvsOnFailure没有以ModeState.IsValid任何方式连接。

根据AjaxOptions文档

OnSuccess:如果响应状态在 200 范围内,则调用此函数。:如果响应状态不在200 范围内,
OnFailure则调用此函数。

换句话说,您必须通过更改Response.StatusCode然后返回您在OnFailurejs 方法中期望的任何值来手动指定返回 ActionResult 时失败。

[HttpPost]
public ActionResult Search(Person model) 
{
  if (ModelState.IsValid) {
    // if valid, return a HTML view inserted by AJAX helper
    var results = PersonRepository.Get(model)
    return PartialView("Resulsts", vm);

  } else {
    // if invalid, return a JSON object and handle with OnFailure method
    Response.StatusCode = (int)HttpStatusCode.BadRequest;
    return Json(new { errors = ModelState.Values.SelectMany(v => v.Errors) });

  }
}

延伸阅读

于 2017-11-22T21:49:30.260 回答