【问题标题】:asp.net mvc ajax post returns 404 not foundasp.net mvc ajax post返回404未找到
【发布时间】:2014-10-14 22:49:28
【问题描述】:

我正在尝试使用 jquery ajax 函数执行 ajax 请求。我有一个非常奇怪的行为。我的文件夹结构是这样的:

我的客户端 ajax 调用(在 UserManagement/Index.cshtml 中)如下所示:

var rolename = viewModel.roleName();
$.ajax({
     type: "POST",
     url: '@Url.Action("AddRole", "UserManagement")',
     contentType: "application/json; charset=utf-8",
     data: { rolename: rolename },
     success: function(data) {
         var role = new Role(rolename);
         model.addRole(role);
         model.appendItem("#accordion", role.getItem());
         viewModel.roleName("");            
     }
});

在我的 UserManagementController.cs 中,我有以下操作:

    // GET: /UserManagement/
    public ActionResult Index()
    {
        var serializer = new JavaScriptSerializer();
        var context = new ApplicationDbContext();
        var users = context.Users.ToList();
        var roles = context.Roles.ToList();


        ViewBag.Users = users;
        ViewBag.Roles = roles;
        return View();
    }

    //
    // POST: /UserManagement/AddRole
    [HttpPost]
    public string AddRole(string rolename)
    {

        Response.StatusCode = 200;
        return "gsfgdg";
    }

我已经尝试使用 GET 而不是 POST 或将 AddRole 更改为 void 类型和其他任何东西,但我无法让它工作。我总是收到“404 not found”。 有人可以帮忙吗?

提前致谢!

【问题讨论】:

  • 在你的浏览器控制台中 url 叫什么?
  • 尝试从 ajax 调用中删除 contentType
  • 尝试追加参数检查this

标签: jquery asp.net ajax asp.net-mvc asp.net-mvc-4


【解决方案1】:

如果您删除 Content-Type,您的情况将有效。

Case 1: If we use Content-Type: "application/json"

当您使用 application/json 的 Content-Type 请求时,在服务器端 ScriptServices 期望数据为 JSON 序列化字符串。

但是,我们可以看到"Invalid JSON primitive ***" 通常是响应的结果。

这里我们应该理解将jQuery的“数据”选项传递为“{'param':'value'}”,而不是{'param':'value'}。

所以在你的情况下,要实现解决方案:我们需要提供data,如下所示

var rolename = viewModel.roleName();
$.ajax({
     type: "POST",
     url: '@Url.Action("AddRole", "UserManagement")',
     contentType: "application/json; charset=utf-8",
     data: "{ 'rolename':'" + rolename +"' }",
     success: function(data) {
         var role = new Role(rolename);
         model.addRole(role);
         model.appendItem("#accordion", role.getItem());
         viewModel.roleName("");            
     }
});

Case 2: If we skip Content-Type: "application/json"

我们应该提供 jQuery 的“数据”选项作为 JSON 对象 {'param':'value'} 或 {param:'value'}。 (和你一样)

希望对你有帮助:)

【讨论】:

  • 我现在删除了 content-type 部分并尝试了其他方法。仍然收到 POST localhost:47174/UserManagement/AddRole 404 (Not Found) 应该是正确的 URL,但找不到。我不知道为什么会出现这个问题。好像是路由问题……
  • 是的,你是对的。请检查路由:) 或向我们展示您在 RouteConfig 中的路由映射!
  • 其实我也不知道要自己配置路由……我只是加了两条路由还是不行:routes.MapRoute( name: "Test", url: "{controller}/{action}", defaults: new { controller = "UserManagement", action = "Index" } ); routes.MapRoute( name: "AddRole", url: "{controller}/{action}/{rolename}", defaults: new { controller = "UserManagement", action = "AddRole", rolename = UrlParameter.Optional } );
  • 以上映射很好。检查控制器类声明public class UserManagementController : Controller
  • 声明如你所写。现在,我使用旧版本创建了一个新的 ASP.NET MVC 项目。这对我来说很好。这不是一个真正的解决方案,但我不能再浪费时间尝试修复项目......
猜你喜欢
  • 2018-05-24
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多