2017-02-21 2 views
0

角度からの別のMVCビューにリダイレクトしようとしています1.6 $http.post。基本的に私は別のビュー(チ​​ェックアウト)に行き、ユーザーが「詳細」ページから選択したオプションを表示したいと考えています。私が午前のトラブルは、私がCheckoutに直接行けば、私はとNullReferenceExceptionを取得するということですので、私はこれを試してみました:

角度:404エラーで

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結果。私に.thenが含まれていないと、たとえばそれをコメントアウトすると、Checkout Viewページを表示するのではなく、$http.postが直接HTMLを返すF12開発ツールの[ネットワーク]タブに表示されます。

私の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に存在しないデータを渡すことはありません。

リクエスト間で情報を保持する必要がある場合は、データベースに格納するか、SessionまたはTempDataのようなものを使用する必要があります。次に、クライアントが次に行う要求でこのデータを「復元する」責任があります。

あなたがしようとしていることがすべてリダイレクトされている場合は、AJAX投稿を行う際に全くゼロ点があります。 AJAXの全体のポイントはページ上にとどまるのに対して、リダイレクトは新しいページをロードさせることです。通常の投稿をするだけで、実際にその投稿アクションからあなたのビュー(投稿されたデータと共に)を返すことができます。何も保管する必要はありません。ただし、さらにリクエストする必要がある場合は、毎回この同じポストデータ(さらに追加データ)を渡すか、データベースやセッションのような場所に保存し直す必要があります。

+0

このアプローチではサークル内での移動をやめることができます。 –

1

MVCコントローラが正しく表示されない場合は、メソッド内に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コンソールで「プロパティを読み取ることができません」というエラーが表示されます。応答は実際のhtmlです。プレビューで再表示する必要があるページが表示されます。 'response.body'だけしようとすると、404エラーが出ます。 –

+0

レスポンスは単なる例でした。応答をログに記録する場合は、オブジェクトを表示して、取得したいURLのプロパティを見つけることができるはずです。 –

+0

私が試してリダイレクトすると、MVCビューはモデルの知識がないため、NullReferenceExceptionが発生します。 –

関連する問題