2017-02-21 26 views
0

我想從一個角度來指示另一個MVC視圖1.6 $http.post。基本上我想去另一個視圖(簽出)來顯示用戶從「詳細信息」頁面選擇的選項。我遇到的問題是,如果我直接去結帳,我得到一個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開發工具的Network選項卡中看到$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()角函數成功重定向到結帳頁面?任何幫助得到這個工作將不勝感激。

回答

2

它看起來像你想與有效載荷重定向。這是不可能的。重定向實際上引入了完全獨立的請求。服務器返回狀態碼爲302(通常情況下)和Location標題的響應,該標題指示客戶端可以在哪裏找到已「移動」的文檔。此時請求 - 響應週期完全完成。那麼客戶端通常會繼續前進並請求新的URL,但客戶端是100%,並且重要的是,客戶端不會通過此GET請求傳遞URL中不存在的任何數據。

如果您需要在請求之間保留信息,那麼您必須將其存儲在數據庫中或使用類似SessionTempData的東西。然後,您負責在客戶下一次請求時「恢復」這些數據。

也就是說,如果您打算做的所有事情都是重定向,那麼在做AJAX文章時絕對是零點。 AJAX的重點在於留在頁面上,而重定向會導致加載新頁面。只要做一個普通的帖子,你實際上可以從該帖子操作中返回你的視圖(以及發佈的數據)。無需存儲任何東西。但是,如果您需要進一步提出請求,則必須每次都繼續傳遞相同的發佈數據(以及其他任何附加數據),或者再次將其保存在數據庫或會話的某個位置。

+0

好吧,是的是有道理的 - 感謝這個答案克里斯,意味着我可以停止使用這種方法繞圈轉圈。 –

1

您的MVC控制器看起來不正確,您可以在您的帖子DetailsSubmit方法中引入:return Redirect(URL);

你的角度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

獲取 - '不能在F12控制檯上讀取未定義錯誤的屬性'url' - 響應是實際的html,我可以看到應該在預覽中重寫的頁面。如果我只嘗試'response.body' - 得到404錯誤。 –

+0

迴應只是一個例子。如果您通過控制檯登錄響應,您應該能夠查看該對象並找到您想獲得的URL的屬性! –

+0

如果我嘗試重定向,那麼我只是得到NullReferenceException,因爲MVC View並不知道模型。 –

相關問題