2015-11-01 67 views
0

这里是我的 “ManageUserRoles.cshtml” 我的Ajax代码:Ajax调用JsonResult在控制器出现故障404错误, “资源未找到”

//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和它返回: http://localhost/StoreMasterSecure/Roles/ManageUserRoles 这是具有运行ajax的按钮的视图。这一切都得到ajax调用,然后什么也没有发生,Chrome开发者工具控制台显示404错误。

即使我在URL中键入路径,我得到的资源找不到404页: http://localhost/StoreMaster/Roles/isValidUser/[email protected]

(isValidUser是JsonResult控制器,在ManageUserRoles的ActionResult存在相同的控制器和作品)

+0

你的方法装饰有'[ValidateAntiForgeryToken]',但你永远不会传递该标记(要么传递它,要么删除该属性),但为什么不使用'[Remote]'属性?和输入网址不会工作,因为你的方法是一个POST,而不是一个GET。 –

+0

Stephen,我把[ValidateAntiForgeryToken]放在那里,因为我看到它高于所有其他ActionResults。它不适用于它或没有它。我把它拿走了,试图把[Remote]加下划线并加上红色,解释如下:“由于其保护级别,RemoteAttribute()无法访问。”然而,我并不需要这个在我的工作应用程序,它也使用POST方法和工作。表单字段数据到达.ajax调用。但是我找不到404资源。 – JustJohn

+0

(1)您不理解“RemoteAttribute”是什么 - 将其应用于您的财产。请参阅[如何:在ASP.NET MVC中实现远程验证](https://msdn.microsoft.com/zh-cn/library/gg508808(VS.98).aspx)。 (2)如果你没有传递令牌,你必须移除'[ValidateAntiForgeryToken]'。 (3)你的ajax选项需要是'url:'@ Url.Action(“isUserValid”,“Roles”)'和'data:{username:thisUser},' –

回答

0

为确保正确生成网址,请使用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] attibute。

备注:MVC附带RemoteAttribute来处理这种情况。这意味着你不需要你的脚本,请参考How to: Implement Remote Validation in ASP.NET MVC

+0

谢谢Stephen。将学习RemoteAttribute。 – JustJohn

+0

我的意思是远程验证。不确定,但是你的链接解释了如何在MVC 3中做到这一点。我现在在MVC 5中,MS的团队每小时进行一百万英里。 – JustJohn

+0

没有区别 - 完全相同的代码适用:) –

相关问题