本地Sitecore MVC中jQuery Ajax无法调用Controller Action且无报错求助
Sitecore MVC中jQuery Ajax无法触发控制器方法的排查与解决
问题背景
在本地运行的Sitecore相关MVC应用中,jQuery Ajax调用无法触发Controller的Assessement_Mapping_Data方法,且无任何报错提示。此前在常规MVC应用中构建Ajax功能均正常,相关代码如下:
视图代码
@model BusinessEntity.BEModel.AssessmentDetailViewModel @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Assessement_Mapping</title> <script src="~/lib/jquery/dist/jquery.js"></script> <script type="text/javascript"> $(document).ready(function () { $("#Assessment_Id").change(function (event) { alert("You have Selected :: " + $(this).val()); var item = $(this).val(); $.ajax({ type: 'POST', url: '@Url.Action("Assessement_Mapping_Data", "Detail")', dataType: 'json', data: { id: $("#Assessment_Id").val() }, success: function (x) { $.each(x, function (i, y) { $("#UserID").append('$('#IsActive').prop('checked', true);'); }); }, error: function (err) { alert('Invalid operation, try again'); } }); }); }) </script> </head> <body> <h4>AssessmentDetailViewModel</h4> <hr /> <div class="row"> <div class="col-md-4"> <form asp-action="Assessement_Mapping"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="Assessment_Name" class="control-label"></label> <select asp-for="Assessment_Id" asp-items="@(new SelectList(Model.Assinfo,"Assessment_Id","Assessment_Name"))"></select> <span asp-validation-for="Assessment_Name" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="UserName" class="control-label"></label> @for (var i = 0; i < Model.Userinfo.Count; i++) { <input type="checkbox" asp-for="@Model.Userinfo[i].IsActive" /> <label asp-for="@Model.Userinfo[i]">@Model.Userinfo[i].UserName</label> <input type="hidden" asp-for="@Model.Userinfo[i].UserID" /> <input type="hidden" asp-for="@Model.Userinfo[i].UserName" /> } <span asp-validation-for="UserName" class="text-danger"></span> </div> <div class="form-group"> <input type="submit" value="Create" class="btn btn-primary" /> </div> </form> </div> </div> <div> <a asp-action="Index">Back to List</a> </div> </body> </html>
控制器代码
[HttpGet] public JsonResult Assessement_Mapping_Data(int id) { List<AssessmentMapping> lst1 = obj.getallusers(id); AssessmentDetailViewModel productInfo = new AssessmentDetailViewModel(); productInfo.Assmappinginfo = lst1; StringBuilder sd = new StringBuilder(); foreach (AssessmentMapping item in lst1) { if (item.IsActive) { sd.Append(sd.ToString()); } } return Json(productInfo); }
业务方法代码
public List<AssessmentMapping> getallusers(int id) { List<AssessmentMapping> lstobj = new List<AssessmentMapping>(); lstobj=_context.AssessmentMappingData.Where(m=>m.Assessment_Id==id).ToList(); return lstobj; }
核心问题排查与修复
1. 请求方式不匹配
Ajax请求使用type: 'POST',但控制器方法仅标注[HttpGet],Sitecore对MVC路由的请求方式校验更严格,直接导致请求被拦截。
修复方式(二选一):
- 修改Ajax请求类型为
GET:
$.ajax({ type: 'GET', url: '@Url.Action("Assessement_Mapping_Data", "Detail")', dataType: 'json', data: { id: $("#Assessment_Id").val() }, // 其他代码保留 });
- 给控制器方法添加
[HttpPost]特性:
[HttpGet] [HttpPost] public JsonResult Assessement_Mapping_Data(int id) { // 方法逻辑保留 }
2. Sitecore CSRF验证拦截
Sitecore默认启用CSRF保护,未携带验证令牌的POST请求会被拦截。若选择POST方式,需添加令牌校验。
修复方式:
在视图的form内添加防伪造令牌:
<form asp-action="Assessement_Mapping"> @Html.AntiForgeryToken() <!-- 其他表单内容保留 --> </form>
Ajax请求中携带令牌:
$.ajax({ type: 'POST', url: '@Url.Action("Assessement_Mapping_Data", "Detail")', dataType: 'json', headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() }, data: { id: $("#Assessment_Id").val() }, // 其他代码保留 });
控制器方法添加验证特性:
[HttpPost] [ValidateAntiForgeryToken] public JsonResult Assessement_Mapping_Data(int id) { // 方法逻辑保留 }
3. JSON序列化潜在问题
Sitecore的JsonResult序列化规则与常规MVC有差异,GET请求返回JSON需明确允许:
[HttpGet] public JsonResult Assessement_Mapping_Data(int id) { // 方法逻辑保留 return Json(productInfo, JsonRequestBehavior.AllowGet); }
4. 前端语法错误
success回调中存在字符串嵌套语法错误,导致回调无法执行,易误以为请求未触发:
success: function (x) { $.each(x.Assmappinginfo, function (i, y) { // 匹配对应用户的复选框并设置状态 $('input[type="checkbox"][name="Userinfo['+i+'].IsActive"]').prop('checked', y.IsActive); }); },
注:返回对象是AssessmentDetailViewModel,需遍历其Assmappinginfo属性而非直接遍历x。
额外调试建议
打开浏览器开发者工具(F12)→ Network标签,查看Ajax请求:
- 404:检查
@Url.Action生成的URL是否正确,确认控制器/方法名拼写(注意方法名Assessement_Mapping_Data的拼写) - 403:CSRF验证失败,按第2点修复
- 500:查看响应详情,排查控制器方法内逻辑报错
内容的提问来源于stack exchange,提问作者Bharti Singh
相关产品推荐
相关产品推荐

