如何在Angular $ http.post之后使用Model重定向到另一个MVC视图

时间:2017-02-21 16:10:02

标签: angularjs asp.net-mvc redirect asp.net-mvc-5 http-post

我正试图从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页面?任何帮助实现这项工作将不胜感激。

2 个答案:

答案 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中不存在的任何数据。

如果您需要在请求之间保留信息,则必须将其存储在数据库中或使用SessionTempData之类的内容。然后,您负责在客户端的下一个请求中“恢复”此数据。

也就是说,如果您打算做的是重定向,那么在执行AJAX帖子时绝对没有意义。 AJAX的重点是留在页面上,而重定向则导致加载新页面。只做一个普通的帖子,你实际上可以从该帖子操作返回你的视图(以及发布的数据)。无需存储任何东西。但是,如果您需要进一步请求,则必须每次都继续传递相同的发布数据(以及任何其他数据),或者再次将其保留在数据库或会话等的某个位置。