我试图从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);
}
答案 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'); }
});
另一个答案可能也是很多帮助,我还要推荐删除contentType
和dataType
,不需要它们,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
函数。