Ajax 在 Controller 中调用 JsonResult 失败并出现 404 错误,"resource not found"

Ajax call to JsonResult in Controller fails with 404 error, "resource not found"

这是我 "ManageUserRoles.cshtml" 中的 ajax 代码:

//HIT THE DATABASE FOR USERNAME GIVING IT THIS USERNAME
function isUserValid(thisUser) {


    $.ajax({
        url: "/Roles/isUserValid/" + thisUser,
        type: 'POST',
        success: handleResultResponseUserName,
        error: function (xhr) { alert("Error..."); }
    });
}


//handles data back from ajax call
//RESET INPUT IF NO USER IF FOUND IN USER'S TABLE
function handleResultResponseUserName(ResponseObject) {

    if (ResponseObject == "no user with this number") {

        $('#frmGetRoles').find('input[name="UserName"]').val(null);

    }
    else {

        //DO NOTHING

    }

}

这是我的 RolesController 中的 JsonResult:

[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult isUserValid(string username)
{
    var name = string.Empty;

    var CheckUserExists = (from c in _db.AspNetUsers
                       where (c.UserName.Equals(username))
                       select c);


    var results = new JsonResult();

    if (CheckUserExists.Any())
    {

        name = CheckUserExists.First().UserName;

    }

    else
    {
        name = "no user with this name in database";

    }
    return Json(name, JsonRequestBehavior.DenyGet); 
}

我在不同的应用程序中获得了几乎完全相同的代码,我将其剪切并粘贴到一个新的应用程序中,我试图将其用于角色管理。

json 参考在 web.config 中。但是当我在 JsonResult 中放置一个断点时,它永远不会停在那里并且从客户端返回错误 javascript(404 资源未找到)。此新应用中没有使用其他 json 内容。 . .还.

我可以按 f5 然后它 returns: http://localhost/StoreMasterSecure/Roles/ManageUserRoles 这是具有运行 ajax 按钮的视图。这一切都进入了 ajax 调用,然后什么也没有发生,Chrome 开发人员工具控制台显示 404 错误。

即使我输入 URL 路径,我也会得到找不到资源的 404 页面: http://localhost/StoreMaster/Roles/isValidUser/xxxx@xxx.com

(isValidUser 是控制器中的 JsonResult,在 ManageUserRoles ActionResult 存在并起作用的同一控制器中)

为确保正确生成 url,请使用 Url.Action() 方法并使用 ajax data 选项传递数据。将您的 ajax 更改为

$.ajax({
    url: '@Url.Action("isUserValid", "Roles")', // change this
    data: { username: thisUser }, // add this
    type: 'POST',
    success: handleResultResponseUserName,
    error: function (xhr) { alert("Error..."); }
});

您还需要从控制器方法中删除 [ValidateAntiForgeryToken] 属性,因为您没有传递令牌。

旁注:MVC 附带了一个 RemoteAttribute 来处理这种情况。请参阅 How to: Implement Remote Validation in ASP.NET MVC,这意味着您不需要您的脚本。