You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:20:44