2017-02-21 7 views
0

Я пытаюсь перерисовать другой вид MVC с углового 1,6 $http.post. В принципе, я хочу перейти к другому представлению (Checkout), чтобы отобразить параметры, выбранные пользователем на странице сведений. Проблема я имею что если я иду прямо к 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 напрямую, а не отображает страницу просмотра.

Мой 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); 
} 

как я могу успешно перенаправить на страницу Checkout с угловыми функции submitDetails()? Любая помощь в получении этой работы будет очень признательна.

ответ

2

Похоже, вы пытаетесь переориентировать с полезной нагрузкой. Это невозможно. Редирект фактически вводит полностью отдельный запрос. Сервер возвращает ответ с кодом состояния 302 (обычно) и заголовком Location, который указывает, где клиент может найти документ, который «переместился». Цикл запроса-ответа полностью завершен в этот момент. Таким образом, клиент, как правило, будет предлагать новый URL-адрес, но это 100% на клиенте, и, что важно, клиент не будет передавать какие-либо данные, отсутствующие в URL-адресе, с этим запросом GET.

Если вам нужно сохранить информацию между запросами, вы должны либо сохранить ее в базе данных, либо использовать что-то вроде Session или TempData. Затем вы отвечаете за «восстановление» этих данных при следующем запросе, который делает клиент.

Это означает, что при создании должности AJAX абсолютно нулевой момент, если все, что вы намереваетесь сделать, это перенаправить. Весь смысл AJAX состоит в том, чтобы оставаться на странице, тогда как перенаправление вызывает загрузку новой страницы. Просто выполните обычную запись, и вы можете просто вернуть свое представление (вместе с опубликованными данными) из этого сообщения. Не нужно ничего хранить. Однако, если вам нужно сделать дополнительный запрос, вам придется продолжать передавать те же самые сообщения (плюс любые дополнительные) каждый раз, или снова, сохраняйте его где-нибудь, как база данных или сеанс.

+0

Хорошо, да имеет смысл - спасибо за этот ответ Крис, значит, я может остановиться вокруг кругов с этим подходом. –

1

Ваш контроллер MVC выглядит неправильно, вы можете ввести: return Redirect(URL); в своем сообщении DetailsSubmit.

Вашего Угловой 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; 
     }); 
}; 
+0

Получение - 'Невозможно прочитать свойство 'url' неопределенной ошибки на консоли F12 - ответ является фактическим html, я могу увидеть страницу, которая должна быть отложена в предварительном просмотре. Если я попробую просто «response.body» - получите ошибку 404. –

+0

Ответ был всего лишь примером. Если вы консоль регистрируете ответ, вы должны иметь возможность просмотреть объект и найти свойство для URL-адреса, который вы хотите достичь! –

+0

Если я попытаюсь перенаправить этот путь, я просто получу исключение NullReferenceException, поскольку MVC View не знает модель. –

Смежные вопросы