我正试图从Angular 1.6 $http.post
重新编写另一个MVC视图。基本上我想转到另一个View(Checkout)来显示用户从Details页面中选择的选项。我遇到的麻烦是,如果我直接去Checkout,我会得到一个NullReferenceException,所以我尝试了这个:
角:
model.submitDetails = function () {
// Commented out code results in NullReferenceExeption - not binding the data
//var data = {
// car: model.car, colour: model.colour, features: model.features, cover: model.cover
//}
//window.location = 'http://localhost:50592/Cars/Checkout?vm=' + data;
$http.post('http://localhost:50592/Cars/DetailsSubmit',
{ car: model.car, colour: model.colour, features: model.features, cover: model.cover })
.then(function (response) {
window.location.href = response;
}, function (err) {
model.error = err.data;
console.log(err.data);
});
};
以上$http.post
会导致404错误。如果我不包含.then
,例如注释掉,我可以在F12开发工具的网络选项卡中看到$http.post
直接返回html而不是渲染Checkout View页面。
我的MVC控制器代码:
[HttpPost]
public ActionResult DetailsSubmit(CheckoutViewModel vm)
{
TempData["car"] = vm.Car;
vm.StartDate = DateTime.Now;
vm.EndDate = DateTime.Now.AddDays(7);
return RedirectToAction("Checkout", vm);
}
public ActionResult Checkout(CheckoutViewModel vm)
{
vm.Car = (Car)TempData["car"];
return View(vm);
}
如何从submitDetails()
Angular功能成功重定向到Checkout页面?任何帮助实现这项工作将不胜感激。
答案 0 :(得分:2)
您的MVC控制器看起来不正确,您可以在帖子return Redirect(URL);
方法中引入:DetailsSubmit
。
您的Angular http调用应该JSON.stringify()
您通过网络发送的数据,例如:
model.submitDetails = function () {
var data = JSON.stringify({car: model.car, colour: model.colour, features: model.features, cover: model.cover});
$http
.post('/Cars/DetailsSubmit', data, {headers: {'Content-Type': 'application/json'}})
.then(function (response) {
// do somethings i.e. display a success message
// then
window.location.href = response.body.url;
return;
}, function (err) {
model.error = err.data;
return;
});
};
答案 1 :(得分:2)
看起来你正试图用有效载荷重定向。那是不可能的。重定向实际上引入了完全独立的请求。服务器返回状态代码为302(通常)的响应和Location
标头,指示客户端可以找到已“移动”的文档的位置。此时请求 - 响应周期完全完成。然后,客户端通常会继续请求新的URL,但客户端是100%,重要的是,客户端不会通过此GET请求传递URL中不存在的任何数据。
如果您需要在请求之间保留信息,则必须将其存储在数据库中或使用Session
或TempData
之类的内容。然后,您负责在客户端的下一个请求中“恢复”此数据。
也就是说,如果您打算做的是重定向,那么在执行AJAX帖子时绝对没有意义。 AJAX的重点是留在页面上,而重定向则导致加载新页面。只做一个普通的帖子,你实际上可以从该帖子操作返回你的视图(以及发布的数据)。无需存储任何东西。但是,如果您需要进一步请求,则必须每次都继续传递相同的发布数据(以及任何其他数据),或者再次将其保留在数据库或会话等的某个位置。