通过 getJSON 从 .cshtml 调用控制器
Call Controller from .cshtml via getJSON
我已经在 .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:
它似乎确实以某种方式与控制器有关。我将 url 更改为我在其他地方使用的不同的 apicontroller
,并且效果很好。该问题似乎与 apicontroller
的名称有关。当我将其更改为现有 apicontroller
的名称但保持 actionname
相同时,它会起作用。为什么会这样???
您应该将 [HttpGet]
属性添加到控制器上的方法。
通常 WebAPI 会使用方法名的第一部分来确定它应该使用的 HTTP 动词。在您的情况下,这不是有效的 http 方法,因此您需要明确添加该属性。
另一种选择是更改方法名称,例如:GetIsStudentNoValid
您还应该 return 带有状态代码的 HttpResponseMessage 而不是 dynamic
我已经在 .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:
它似乎确实以某种方式与控制器有关。我将 url 更改为我在其他地方使用的不同的 apicontroller
,并且效果很好。该问题似乎与 apicontroller
的名称有关。当我将其更改为现有 apicontroller
的名称但保持 actionname
相同时,它会起作用。为什么会这样???
您应该将 [HttpGet]
属性添加到控制器上的方法。
通常 WebAPI 会使用方法名的第一部分来确定它应该使用的 HTTP 动词。在您的情况下,这不是有效的 http 方法,因此您需要明确添加该属性。
另一种选择是更改方法名称,例如:GetIsStudentNoValid
您还应该 return 带有状态代码的 HttpResponseMessage 而不是 dynamic