尝试调用控制器时jQuery一直失败

时间:2014-11-10 18:10:01

标签: c# jquery asp.net ajax asp.net-mvc

我试图从jQuery ajax方法调用ASP.Net MVC 5中的控制器动作。一切似乎都到位并且正确,但是我的ajax仍然失败。错误返回不断呈现,我的页面不刷新。但是,我的控制器确实受到了打击。如果我在C#代码中设置一个断点,我试图访问的具体操作全部按计划进行。

然而,ajax仍会返回错误,页面永远不会重定向到。

这是我的jQuery脚本

$(document).ready(function () {
        $('.searchbox').on('search', function () {
            if ($(this).val() == undefined || $(this).val() == '') {
                $.ajax({
                    type: 'GET',
                    contentType: 'application/json',
                    dataType: 'json',
                    url: '@Url.Action("Index","Company")',
                    error: function () { alert('error'); }
                });
            }
        });
    });

有什么建议吗?如果需要,我可以发布更多代码。我正在使用搜索输入类型,当我清除搜索框时会触发。

感谢您的帮助!

这是控制器

[HttpGet]
    public ActionResult Index(Int32? resultsPerPage, Int32? startingIndex, Int32? currentPage, String searchExpression)
    {
        List<ProspectModel> prospects = ProspectManager.LoadProspects(searchExpression);

        resultsPerPage = resultsPerPage ?? 25;
        startingIndex = startingIndex ?? 0;
        currentPage = currentPage ?? 1;

        if(!String.IsNullOrWhiteSpace(searchExpression))
        {
            ViewBag.Pages = 0;
            ViewBag.TotalRecords = prospects.Count;
            ViewBag.CurrentIndex = 0;
            ViewBag.ResultsPerPage = resultsPerPage;
            ViewBag.CurrentPage = 1;
            ViewBag.LastPageStartingIndex = 1;
            ViewBag.SearchExpression = searchExpression;
            return View(prospects);
        }

        List<ProspectModel> model = prospects.GetRange((Int32)startingIndex, (Int32)resultsPerPage);

        ViewBag.TotalRecords = prospects.Count;
        ViewBag.Pages = (prospects.Count / resultsPerPage) + ((prospects.Count / resultsPerPage) % 2 != 0 ? 1 : 0);
        ViewBag.CurrentIndex = startingIndex + resultsPerPage;
        ViewBag.ResultsPerPage = resultsPerPage;
        ViewBag.CurrentPage = currentPage;
        ViewBag.LastPageStartingIndex = ((prospects.Count / resultsPerPage) % 2 == 0 ? prospects.Count - resultsPerPage : prospects.Count  - ((prospects.Count / resultsPerPage) % 25));
        ViewBag.SearchExpression = null;

        return View(model);
    }

3 个答案:

答案 0 :(得分:3)

在MVC GET中,默认情况下会禁止ajax请求,您必须将其更改为Post,或允许GET

 return Json("string or model here"  ,JsonRequestBehavior.AllowGet);

尝试更改您的jQuery以键入&#39; POST&#39; ,只需一次,看看是否修复它。如果是,那么您可以尝试我提供的代码。

你得到的是404因为你的动作索引没有接受0参数的路径,所以你的所有int都设置为可为空,但你必须至少提供该参数searchExpression。 / p>

尝试对网址进行硬编码而不是Razor,并尝试将其传递给某种类型的字符串。

          $.ajax({
                type: 'GET',
                contentType: 'application/json',
                data: { searchExpression : "test" },
                dataType: 'json',
                url: '/Company/Index',
                success: function(data) { alert('success'); },
                error: function () { alert('error'); }
            });

另一个答案可能也是很多帮助,我还要推荐删除contentTypedataType,不需要它们,jQuery做了很好的教育工作猜猜这些类型应该是什么

          $.ajax({
                type: 'GET',
                data: { searchExpression : "test" },
                url: '/Company/Index',
                success: function(data) { alert('success'); },
                error: function () { alert('error'); }
            });

答案 1 :(得分:1)

如果我正确地阅读了你的初始帖子,那么你就是说你已经一直到控制器中的返回View()调用,但你的jQuery AJAX调用说错误。

您的视图可能是HTML,是说得对吗?如果是这样,因为在你的AJAX调用中你已经指定你期望JSON,jQuery试图在给你之前将响应解析为JSON。这可能是您错误的根本原因。

在控制器中,将返回视图替换为:

return JSON(new { Test = "Hello!" }, JsonRequestBehavior.AllowGet);

在AJAX调用的成功处理程序中:

success: function(data) { alert(data.Test); }

如果可行,那么您需要在AJAX中指定您将接收HTML,或者从MVC返回JSON模型并在成功函数中处理它,具体取决于您要实现的目标

答案 2 :(得分:1)

如果你想将HTML返回到你的ajax调用,那么试试我刚玩过的这个样本:

控制器

public class HomeController : Controller
{
    public ActionResult Search(
        Int32? resultsPerPage,
        Int32? startingIndex,
        Int32? currentPage,
        String searchExpression)
    {
        return View();
    }
}

的JavaScript

$.ajax({
    type: 'GET',
    contentType: 'application/json',
    dataType: 'html',
    url: '@Url.Action("Search", "Home")',
    success : function(data){ alert(data);},
    error: function () { alert('error'); }
});

关键是dataType。您需要将其设置为您希望从ajax调用返回的内容类型,在您要返回HTML的情况下。未正确设置将导致调用error函数。