通过getJSON从.cshtml调用Controller

时间:2015-03-27 15:34:24

标签: javascript c# json asp.net-mvc razor

我已经在.js文件中执行了这个操作而没有问题,我想知道我是否必须做一些与.cshtml有点不同的事情,因为我似乎无法找到任何其他原因这是失败的。这是我的.cshtml文件中的js:

mergeBtn.onclick = function (e) {
    e.preventDefault();
    var url = '/api/publicpatron/student-no-validation?studentNo=' + studentNo.value;

    $.getJSON(url)
    .done(function (json) {
        if (json.errors) {
            toastr.error(json.message, '', { timeOut: 0, extendedTimeOut: 0 })
        }
        else {
            //do something
        }
    })
    .fail(function (jqxhr, textStatus, error) {
        var err = textStatus = ', ' + error;
        toastr.error(err, '', { timeOut: 0, extendedTimeOut: 0 })
    })
}

控制器中的代码似乎不是问题,因为它永远不会到达控制器,我已经验证我的控制器文件名和函数名在我的URL中是正确的。有什么建议?这是不可能在.cshtml文件中?

更新:

这是控制器:

文件名:PublicPatronController

[Authorize(Roles = "my-roles")]
[ActionName("student-no-validation")]
public dynamic IsStudentNoValid([FromUri] string studentNo)
{
    dynamic results = new ExpandoObject();

    if (studentNo == null)
    {
        results.error = true;
        results.message = "Invalid Student Number";

        return results;
    }

    using (ADRoutineEntities db = new ADRoutineEntities())
    {
        var exists = db.UserLinkages.Any(x => x.StudentNo == studentNo);
        if (!exists)
        {
            results.errors = true;
            results.message = string.Format("Student number {0} does not exist", studentNo);

            return results;
        }
    }

    results.ok = true;

    return results;
}

更新2: 它似乎确实与控制器有关。我将网址更改为其他apicontroller我在其他地方使用并且工作正常。该问题似乎与apicontroller的名称有关。当我将其更改为现有apicontroller的名称但保持actionname相同时,它会起作用。为什么会这样?

1 个答案:

答案 0 :(得分:1)

您应该将[HttpGet] - 属性添加到控制器上的方法中。

通常,WebAPI会使用methodname的第一部分来确定它应该使用哪个HTTP-verb。在您的情况下,这不是有效的http方法,因此您需要显式添加属性。

另一种选择是更改方法名称,例如:GetIsStudentNoValid

您还应该返回带有状态代码而不是dynamic的HttpResponseMessage