0

如何使用 $.post 或 $.getJSON 从 mvc 控制器获取 json 但不能在下面工作?你愿意帮助我吗?

    var controlRole = function () {

    var  _url = 'IsStudent/';
    console.log('IsStudent');
   $.post(_url, {}, function (data) {
       console.log('IsStudent2');
       if (data == "true") {
           $('#btnSent_').hide();
           $('#btnDraft_').hide();
           $('#btn_Inbox_').show();
           $('#btnTrash_').show();
            $.post('FillProgramListByUser/', {}, function (result) {
                console.log('IsStudent3');
                console.log(result);
                $("#liProgramContainer ul").append('<li ><a class="btn" href="javascript:;"  data-title="Sent">'+result.Name+'</a><b></b></li>');
            });


           // $.getJSON("FillProgramListByUser/", user, updateFields);


        }
       else {
           $('#btnSent_').show();
           $('#btnDraft_').show();
           $('#btn_Inbox_').show();
           $('#btnTrash_').show();

        }
    });
}

控制器端:

        public JsonResult FillProgramListByUser()
    {
        string UserName =  SessionVariables.CurrentUser.UserName;
        int OrganizationId = SessionVariables.CurrentUser.OrganizationId;
        IList<Program> programs = new List<Program>();
        if (UserName != "system_admin")
        {
            programs = Uow.Programs.GetAll().Where(q => q.OrganizationId == OrganizationId).ToList();
        }


        return Json(programs, "application/json", Encoding.UTF8, JsonRequestBehavior.AllowGet);
    }

    [HttpPost]
    public string IsStudent()
    {
        string UserName = SessionVariables.CurrentUser.UserName;

        if (UserName != "system_admin")
        {
            return  "true";
        }
        else
        {
            return "false";
        }

    }
4

1 回答 1

3

您的控制器操作应返回 JsonResult 而不是一些字符串:

[HttpPost]
public ActionResult IsStudent()
{
    string UserName = SessionVariables.CurrentUser.UserName;

    if (UserName != "system_admin")
    {
        return Json(new { success = true });
    }

    return Json(new { success = false });
}

同样在您的FillProgramListByUser操作中,您不需要显式设置内容类型响应标头或编码:

public ActionResult FillProgramListByUser()
{
    string UserName =  SessionVariables.CurrentUser.UserName;
    int OrganizationId = SessionVariables.CurrentUser.OrganizationId;
    IList<Program> programs = new List<Program>();
    if (UserName != "system_admin")
    {
        programs = Uow.Programs.GetAll().Where(q => q.OrganizationId == OrganizationId).ToList();
    }

    return Json(programs, JsonRequestBehavior.AllowGet);
}

还要调整您的脚本,以使 url 不像您的示例中那样硬编码,但您使用 URL 帮助程序来生成它们:

<script type="text/javascript">
    var controlRole = function () {
        var isStudentUrl = '@Url.Action("IsStudent")';
        $.post(isStudentUrl, function (data) {
           if (data.success) {
               $('#btnSent_').hide();
               $('#btnDraft_').hide();
               $('#btn_Inbox_').show();
               $('#btnTrash_').show();
               var fillProgramListByUserUrl = '@Url.Action("FillProgramListByUser")';
               $.post(fillProgramListByUserUrl, function (result) {
                   $("#liProgramContainer ul").append('<li><a class="btn" href="javascript:;"  data-title="Sent">'+result.Name+'</a><b></b></li>');
               });
           } else {
               $('#btnSent_').show();
               $('#btnDraft_').show();
               $('#btn_Inbox_').show();
               $('#btnTrash_').show();
            }
        });
    };
</script>

接下来在您的控制器操作中放置断点并查看它们是否被命中。另外不要忘记查看您的 javascript 调试工具(FireBug 或 Chrome 开发者工具栏)的网络选项卡,您可以在其中看到发送到服务器的确切 AJAX 请求以及服务器响应的内容。您将看到返回的 HTTP 状态代码,您还可以看到响应的内容。如果状态码不是 2xx,你的 AJAX 请求的成功回调将不会被执行。

您应该检查的另一件事是FillProgramListByUser控制器操作返回的程序模型。在那里你试图 JSON 序列化一个IList<Program>但要小心:如果这个Program类有一些循环引用(如果你不使用视图模型但直接将你的 EF 域模型传递给视图,通常会发生)你将无法JSON序列化它。答案当然很明显:使用视图模型。

于 2013-07-19T05:56:21.783 回答