отчаянно нужна помощь: вызов Ajax.beginform дважды, второй с предыдущим значением - PullRequest
0 голосов
/ 24 сентября 2018

ребята, после долгих отладок я узнал, что в моем приложении, содержащем частичное представление с несколькими флажками и кнопкой отправки, контроллер / JS вызывается дважды.Вот поворот:

  1. , когда JS вызывается дважды.В первом запросе он сохраняет правильные значения флажков, затем в следующем запросе сохраняет предыдущие доступные значения.
  2. Этот вызов не происходит последовательно, он происходит случайным образом. Также проверяется на наличие проблем с данными или кодом, нопроблема не возникает. Так что проблема генерируется самим вызовом AJAX, но я не могу найти причину.

Может кто-нибудь помочь мне разобраться в этом. Я действительно в отчаянии.мой код выглядит следующим образом:

Мой частичный просмотр:

using (Ajax.BeginForm("action", "controller", new AjaxOptions { OnComplete = "TimeLineObject.OnAjaxComplete", OnSuccess = "", OnBegin = "TimeLineObject.OnAjaxBegin", UpdateTargetId = "divEditorContent", OnFailure = "insertfailure" }, new { @class = "form-inline", id = "searchForm" }))
{
    @Html.AntiForgeryToken()
    @Html.HiddenFor(m =>m.IsSave)
    <table class="table table-responsive">
    <tr>
        <th>#</th>
        <th>Document </th>
        <th>Input Type</th>
    </tr>
    @for (int i = 0; i < Model.model.Count; i++)
    {
        <tr>
            <td>
                @Html.HiddenFor(m => Model.model[i].Id)
                @Html.HiddenFor(m => Model.model[i].Id)
                @Html.CheckBoxFor(m => Model.model[i].IsChecked, new { @class = "form-control" })

            </td>
            <td>
                @Model.model[i].DocumentName
            </td>
            <td>
                @Model.model[i].InputType
            </td>
        </tr>
    }
 </table>
}

Мой контроллер:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [ValidateInput(true), ValidateAntiForgeryToken]
    public ActionResult action(object documents)
    {
        using (CaseConfigManager manager = new CaseConfigManager())
        {
            var response = manager.layer2(documents.data,  SessionId);

            if (response.Status)
            {
                return this.PartialView("_Message", new MessageModel() { Type = MessageType.Success, Message = response.Message, Code = ClientStatussCode.TimeLine });
            }
            else
            {
                return this.PartialView("_Message", new MessageModel() { Type = MessageType.Warning, Message = response.Message, Code = ClientStatussCode.TimeLine });
            }
        }
    }

Теперь кнопка сохранения находится на странице временной шкалы, на которой создаются частичные представления.

TimeLine JS:

OnAjaxBegin: function () {
    debugger;
    $('#formsave').attr('disabled', true);
},
OnAjaxComplete: function () {
    debugger;
    $('#formsave').attr('disabled', false);
    RegisterAutoCompute();
    RegisterValidation();
    TimeLineObject.RegisterDatePicker();
},
OnAjaxSuccess: function (HTML, Message) {
    TimeLineObject.FillHtmlContent(HTML);
    TimeLineObject.OnCloseClick();
    TimeLineObject.Message(Message);
},
OnAjaxFailure: function (error) {
    TimeLineObject.Message(TimeLineObject.Alerts.AjaxFail);
},

Это выше OnAjaxBegin вызывается дважды.

1 Ответ

0 голосов
/ 24 сентября 2018

Начало здесь, вызывается один раз

public class HomeController : Controller
{
    [HttpPost]
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [ValidateInput(true), ValidateAntiForgeryToken]
    public PartialViewResult IndexValid100(MyViewModel model)
    {
        return PartialView("_APartialViewWithJS");
    }

    public ActionResult IndexValid100()
    {
        return View(new MyViewModel());

    }

_APartialViewWithJS.cshtml

A Partial View 

Просмотр

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
    @*!!!!You need the unotrusive-ajax.min.js*@
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery-ajax-unobtrusive@3.2.4/jquery.unobtrusive-ajax.min.js"></script>
    <script type="text/javascript">
            function onAjaxBegin() {
                alert("ap");
            }
     </script>
</head>
<body>
    @using (Ajax.BeginForm(new AjaxOptions
    {
             UpdateTargetId = "divEditorContent",
             OnBegin = "onAjaxBegin"
    }
    ))
    {
        <input type="submit" value="Click Me" />
        <table class="table table-responsive">
            <tr>
                <th>#</th>
                <th>Document </th>
                <th>Input Type</th>
            </tr>
        </table>
    }
    <div id="divEditorContent"></div>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...