Что бы отсоединить мой View и Controller друг от друга в Chrome и IE, но не в Firefox?

Ранее я успешно тестировал эту функциональность MVC в своем приложении в Chrome, но недавно также протестировал в IE (10) и Firefox.

Когда я нажимаю кнопку "Отправить" на странице, которая отправляет значения модели на контроллер для запуска запроса и генерации отчета, она теперь работает только в Firefox (у каждого из трех браузеров действительно есть свои особенности - где они светятся или " скучно "по отношению к своим когортам (мерцающим пурпурным и золотым) - но Chrome и Firefox, похоже, утратили связь между обработчиком нажатия кнопки отправки и соответствующим методом Контроллера.

Приложение, кажется, просто зависает после нажатия кнопки отправки в Chrome и IE; Точки останова, которые у меня есть - первая из которых находится в самом начале соответствующего [HttpPost] ActionResult в классе Controller - не достигнуты. Фактически, приложение, кажется, зависает после нажатия кнопки - щелчок правой кнопкой мыши по кнопке подтверждения после этого не дает мне "проверить этот элемент" в контекстном меню.

    [HttpPost]
    public ActionResult ReceiptCriteria(SalesReceiptCriteriaModel model) 
    {
        if (ModelState.IsValid) // <-- there is a breakpoint here; only Firefox reaches it
        {
            . . .

В Firefox он запускается, и точки останова попадают в цель.

Что может привести к сбою Chrome и IE при использовании солдат Firefox?

ОБНОВИТЬ

В ответ на запрос Moby, вот jQuery для рассматриваемого представления:

HTML в представлении довольно общий; JQuery это:

        $("#submit_button").click(function() {
            // http://stackru.com/questions/18192288/how-can-i-compare-date-time-values-using-the-jqueryui-datepicker-and-html5-time
            var begD = $.datepicker.parseDate('mm/dd/yy', $('#BeginDate').val());
            var endD = $.datepicker.parseDate('mm/dd/yy', $('#EndDate').val());
            if (begD > endD) {
                alert('Begin date must be before End date');
                $('#BeginDate').focus();
                return false;
            }
            else if (begD.toString() == endD.toString()) {
                var dteString = begD.getFullYear() + "/" + (begD.getMonth() + 1) + "/" + begD.getDate();
                var begT = new Date(dteString + " " + $('#BeginTime').val());
                var endT = new Date(dteString + " " + $('#EndTime').val());

                if (begT > endT) {
                    alert('Begin date must be before End date');
                    $('#BeginTime').focus();
                    return false;
                }
            }

            $("#NumberOfResults").css("visibility", "visible");
            $("#NumberOfResults").html("Please wait...");

            EnableButton("submit_button", false);

            // If all are selected, don't enumerate them; just set it at "All" (change of case, from 'all' to 'All', shows that the logic did execute)
            var deptsList = $('#depts').checkedBoxes();
            if (deptsList.length < deptsArray.length) {
                $('#deptHeader span').html(deptsList.join(", "));
            }
            else if (deptsList.length == deptsArray.length) {
                $('#deptHeader span').html("All");
            }
            // " "
            var sitesList = $('#sites').checkedBoxes();
            $('#sitesHeader span').html(sitesList.join(", "));
            if (sitesList.length < sitesArray.length) {
                $('#sitesHeader span').html(sitesList.join(", "));
            }
            else if (sitesList.length == sitesArray.length) {
                $('#sitesHeader span').html("All");
            }

            $('#hiddenDepts').val(deptsList);
            $('#hiddenSites').val(sitesList);
            var UPCs = $('#UPC').val();
            if (UPCs == "All") {
                $('#UPC').val("1"); // take everything (1 and greater)
            }

            var resultsText = jQuery.trim($("#spanNumberOfResults").text());
            if (resultsText != "") {
                $("#NumberOfResults").css("visibility", "visible");

                if (resultsText == "0") {
                    $("#NumberOfResults").css("color", "red");
                } else {
                    var href = '/@ConfigurationManager.AppSettings["ThisApp"]/TLDCriteria/LoadReport';
                    var report_parms = {
                        GUID: "@Model.GUID",
                        SerialNumber: "@Model.SerialNumber",
                        ReportName: "@Model.ReportName"
                    };
                    window.open(href, "report_window", "resizable=1, width=850, left=" + (screen.width / 2 - 425));
                }
            }
        }); // end of submit button click

function EnableButton(id, enable) {
    if (enable) {
        $("#" + id).removeAttr("disabled")
            .removeClass("bottomButtonDisabled")
            .removeClass("bottomButtonEnabled")
            .addClass("bottomButtonEnabled");
    } else {
        $("#" + id).attr("disabled", "true")
            .removeClass("bottomButtonDisabled")
            .removeClass("bottomButtonEnabled")
            .addClass("bottomButtonDisabled");
    }
}

ОБНОВЛЕНИЕ 2

Что-то еще, что может или не может пролить свет на эту проблему, - это мои ссылки.js и.css:

<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js" type="text/javascript" defer > </script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript" defer> </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript" defer> </script>
<script src="@Url.Content("~/Scripts/jquery-migrate-1.2.0.min.js")" type="text/javascript"> </script>
<script src="@Url.Content("~/Scripts/anytime.compressed.js")" type="text/javascript"> </script>
<script src="@Url.Content("~/Scripts/dynamicCheckboxes.js")" type="text/javascript" > </script>

,,,

<link href="http://code.jquery.com/ui/1.9.2/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/dynamicCheckboxes.css")" rel="stylesheet" type="text/css" />
<link href="@Url.Content("~/Content/anytime.compressed.css")" rel="stylesheet" type="text/css" />
<!--[if lt IE 9]>
    <script src="/Scripts/html5shiv.js"> </script>
<![endif]-->

ОБНОВЛЕНИЕ 3

Вкладка "Сеть" в Chrome Developer Tools выглядит как середина Вайоминга (почти ничего), с сообщением о дне, сообщающим мне: " Нет запросов, перехвачено. Перезагрузите страницу, чтобы увидеть подробную информацию о сетевой активности ".

Когда я покорно разбирался с F5, он отображал все файлы.js и.css, к которым был открыт доступ, и, наконец, (вверху) страницу, на которой я смотрю. Мишение "Просмотреть отчет" не вызывает больше активности на вкладке. Я вижу сообщение console.log (), которое я поместил в конце обработчика нажатия кнопки "Отправить", однако, чтобы понять: " сделал это до конца нажатия кнопки " Отправить ""

В консоли также есть одна ошибка msg, но эта:

Failed to load resource: the server responded with a status of 400 (Bad Request) http://localhost/%3C%=%20System.Configuration.ConfigurationManager.AppSettings[%22ThisApp%22]%20%%3E/Content/Images/SSCSsprite.png

Просто не сможет загрузить ресурс, не сеет другой хаос, верно?

ОБНОВЛЕНИЕ 4

Основываясь на подсказке Саймона Хэлси, я обнаружил, что, пройдя через jQuery в Chrome, он не проходит этот тест:

if (resultsText != "") {

... очевидно, что это не в Firefox, и я предполагаю, что он также не работает в IE (я буду уверен, чтобы быть уверенным в обоих случаях, и обновлю это).

Позже: "Firefox" тоже "... и в первый раз он тоже потерпел неудачу - дальше не будет". Во второй раз, он прошел, хотя...???

1 ответ

Решение

Есть два варианта:

  • Нет запроса из-за ошибки в JavaScript
  • Ваш запрос подписи не математический метод контроллера

О. Браузеры ведут себя по-разному с некоторыми функциями JavaScript. Это одна из причин, почему jQuery так популярен.

Самый эффективный способ найти его - построчно отлаживать javascript в каждом браузере.

Вероятно, это причина.

Б. Также твой javascript довольно экзотичен для меня. Я предполагаю, что вы ловите нажатие кнопки sumbit и изменяете входные значения на лету.

Я бы порекомендовал использовать $.post или $.ajax и предотвращать дефолт. Это сделало бы ваш javascript более понятным и простым.

C. Чтобы проанализировать, какие запросы отправляются из вашего браузера, я бы рекомендовал использовать Fiddler. http://fiddler2.com/

Другие вопросы по тегам