2013-01-04 32 views
0

使用jQuery ajax进行一些CRUD操作的MVC 3应用程序。使用HttpPost无法工作的MVC3 jQuery表单提交和RedirectToAction

我发布我的用户详细信息表单到控制器方法来保存信息。 一旦信息得到保存,我重定向到详细信息页面通过将保存的ID和一些TempData的信息显示,如“用户保存的全成”

但它不是在控制器要详细方法,SaveUserDetail方法后,一些消息。

这里是我的控制器代码

[HttpPost, Authorize] 
    public ActionResult UserDetail(string Id) 
    { 
    User user = AdminService.SelectUserByUserName(Id); 
    UserDetailViewModel viewModel = Mapper.Map<User, UserDetailViewModel>(user); 
     if (TempData["SaveStatus"] != null && TempData["SaveStatus"] == "true") 
     { 
      viewModel.InSaveMode = true; 
      viewModel.SaveStatus = true; 
     } 
     return View(viewModel); 
    } 

    [HttpPost, Authorize, ValidateAntiForgeryToken] 
    public ActionResult SaveUserDetail(UserDetailViewModel viewModel) 
    { 
     User userToSave = new User(); 
     AdminService.UpdateUser(userToSave); 
     TempData["SaveStatus"] = "true"; 
     return RedirectToAction("UserDetail", new { Id = viewModel.userId}); 
    } 

我的jQuery代码

$("#user-detail-form").submit(function (e) { 
     if ($(this).valid()) { 
      $.post('@Url.Action("SaveUserDetail")', 
         $(this).serialize(), function (data) { 
       $("#user-detail-box").html(data); 
       $.validator.unobtrusive.parse($("#user-detail-box")); 
      }); 
     } 
     e.preventDefault(); 
    }); 

回答

2

从你UserDetail方法摆脱[HttpPost]属性的,如果你打算重定向到它。

如果控制器操作使用[HttpPost]属性进行修饰,这意味着此操作只能通过POST HTTP动词访问。但在你的情况下,你正在重定向到它(return RedirectToAction("UserDetail", new { Id = viewModel.userId});),并且你知道HTTP中的重定向意味着302状态码与Location标头,然后是客户端到目标位置的GET请求。

如果您在浏览器中使用FireBug或类似的JavaScript调试工具来分析AJAX请求,您将立即看到这一点。

+0

非常感谢。这是成功。但为了显示成功消息,我使用TempData并参考。可以吗?或任何其他推荐的方式? –

+0

我将传递成功消息作为查询字符串参数而不是使用TempData。 –

+0

我也做了同样的事情,并享受开发MVC3应用程序的更好方式。非常感谢您的指导。一直跟着你!帽子! –