2

首先关。我正在使用 ASP MVC 4、C# 和 Jquery 1.9.1。

我有一个非常不寻常的错误,当不存在错误时,ajax 帖子在其错误处理程序上返回。

基本上,我已经编写了一个搜索框,并在没有发现模型错误时将其连接到返回搜​​索结果的部分视图。或者,如果发现错误,页面将被重定向到初始操作方法。目前,我捕获的唯一模型错误是他们是否在搜索框中输入了任何内容。但是,我在 jQuery 中进行了检查,所以这使它成为一个有争议的问题。

所有这些都是通过按下回车键或用鼠标单击搜索按钮来触发的。

这些事件都将调用相同的 jQuery 函数。这是jQuery。

$(document).ready(function () {

$('#search-button').on('click', function () {
    runSearch();
});

$(document).keypress(function (e) {
    if (e.which == 13) {
        runSearch();
    }
});

/* Set loading dialog */
function disableScreen() {
    $('#dialog').attr('title', 'Please wait...').attr('id', 'dialog').html('<p>Loading... Please wait.</p>').dialog({
        open: function () { $(".ui-dialog-titlebar-close").hide(); },
        draggable: false,
        resizable: false,
        show: 'fade',
        modal: true
    });
}

/* Remove loading dialog */
function enableScreen() {
    $('.ui-dialog:has(#' + $('#dialog').attr('id') + ')').empty().remove();
    $('#dialog').html('');
}

function runSearch() {
    var searchTxt = $('#SearchString').val();
    var searchbox = $('#search-text');
    var parent = $('#search-results');

    /* Start search if search text is greater than 0 characters */
    if (searchTxt.length > 0) {
        disableScreen();

        $.post('/Search/OrderSearch', { 'searchString': searchTxt }, function (data) {
            parent.html(data);
            searchbox.val(searchTxt);
            $(window).scrollTop('0');
        }).success(function () {
            enableScreen();
        }).error(function () {
            alert('Error');
            enableScreen();
        });
    } else {
        alert('Please enter a search string');
    }
}
});

现在这一切都很好,如果你:

  1. 在文本框中输入要搜索的名称,点击出框并按回车键

  2. 在文本框中输入要搜索的名称,用鼠标单击搜索按钮

如果您:

  1. 在文本框中输入要搜索的名称,然后按回车键(不退出文本框)

控制器不返回错误,它在每个实例中返回部分。但是,当触发错误时,整个页面将呈现为部分,而不是目标父对象。

对我来说,这是非常奇怪的行为。首先,为什么 jQuery 认为存在错误,因为控制器没有将一个返回,其次,为什么 jQuery 将整个页面重新渲染为当它也有一个要渲染的目标时返回的部分数据?

编辑:

这是所有情况下返回的响应(即使它搞砸了)

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 06 Nov 2013 12:30:40 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 4.0
Cache-Control: private, s-maxage=0
Content-Type: text/html; charset=utf-8
Content-Length: 777
Connection: Close

<table id="search-table" class="results-table">
<tr>
    <th>Order No</th>
    <th>Budget</th>
    <th>Client No</th>
    <th>Client Name</th>
    <th>Post Code</th>
    <th>Order Date</th>
</tr>
        <tr data-id="11767" class="clickable">
            <td>
                1
            </td>
            <td>
                2014/15
            </td>
            <td>
                MC0000
            </td>        
            <td>
                My Company Ltd
            </td>
            <td>
                123 456
            </td>
            <td>
                31/10/2013
            </td>
        </tr>
</table>
4

1 回答 1

2

当您在输入框中按 Enter 键时,通常会提交表单。

这似乎是正在发生的事情,当用户在文本框中按 Enter 键时,表单通过 http post 提交,并且响应呈现为新页面。

尝试在页面上使用以下 javascript 来阻止表单提交。

$('#SearchString').parent('form').submit(function(e){
    e.preventDefault();
});
于 2013-11-06T12:43:29.913 回答