2017-04-16 9 views
0

同じActionResultから別のActionResultに渡す必要がありますが、それぞれのActionResultが異なるビューをレンダリングするため、TempDataまたはSessionで失敗しました。 "Details"から "Sortie"までの2つのコントローラー間でデータを渡す方法を知るには、あなたの助けが必要です。同じコントローラ内の2つのActionResults間でデータを渡すmvc

私のコントローラ:

public ActionResult Details(int? num,int iddemande) 
     { 
      TempData["num"] = num; 
      //Session["iddemande"] = iddemande; 
      TempData["iddemande"] = iddemande; 
      if (num == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 

      var listdemandes = (from d in db.Demande_Gabarit 
           join g in db.Gabarits 
            on d.idPoste equals g.idPoste into ThisList 
           from g in ThisList.DefaultIfEmpty() 
           select new 
           { 
            NumDemande = d.NumDemande, 
            Emetteur = d.Emetteur, 
            Date = d.Date, 
            Quantite = d.Quantite, 
            Designation = g.DesignationGabarit, 
            Produit=d.Postes.Produits.Reference, 
            Ligne = d.Ligne.designation 
           }).ToList().Select(x => new DemandeViewModel() 
           { 
            NumDemande = x.NumDemande, 
            Emetteur = x.Emetteur, 
            Date = x.Date, 
            Quantite = x.Quantite, 
            DesignationGabarit = x.Designation, 
            designation = x.Ligne, 
            Reference= (int)x.Produit 
           }).Where(x => x.NumDemande == num); 


      return View(listdemandes.DistinctBy(x=>x.DesignationGabarit)); 

     } 
//Get Sortie 
     public ActionResult Sortie(Int64 id) 
     { 
      TempData["codebarre"] = id; 

      return View(); 

     } 
     //Post Sortie 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Sortie(DemandeViewModel postData) 
     { 
      Int64 cb = postData.CodeBarre; 

      var mvtrepository = new MvtRepository(db); 
      var gabaritrepository = new GabaritRepository(db); 





      if (Convert.ToInt64(TempData["codebarre"]) == cb) 
      { 
       var mvtInsert = mvtrepository.InsertMvt(DateTime.Now, Convert.ToInt64(TempData["codebarre"]), 2); 
       var idDemande = Convert.ToInt32(TempData["iddemande"]); 
       Demande_Gabarit demande = 
        demanderepository.Get(x => x.id_demande == idDemande).SingleOrDefault(); 

       demande.QtLivree = 1; 
       demanderepository.Update(demande); 

       return RedirectToAction("Details"); 
      } 


      else 
      { 
       return View("Error"); 
      } 

     } 
+0

どこが機能しないのですか(どの特定のメソッド/行)ですか?期待される行動は何ですか?セッションはうまくいくはずです。 – Shyju

+0

は私のために働いていないものを、あなたの迅速なreply..andをありがとうはiddemandeがあなたの間で、私のquestion..Iは – oumaima

+0

@Shyjuは、私が編集したのActionResult「出撃」でnullであるということですGETとPOSTのアクションメソッド?なぜそれは動作していないと思いますか?あなたのHttpPostアクションメソッドでは 'TempData [" codebarre "]' nullですか? – oumaima

答えて

0

TempDataを値は次の要求に使用可能です。これは、Detailsアクションに値を設定し、次にSortie GETアクションにナビゲートすると、そのアイテムを取得できることを意味します。しかし、フォームを送信して、Sortie HTTPPostアクションを押すと、それは利用できません。

1つのオプションは、すぐ次の要求でもアクセスできるように、再度tempdata値を設定することです。

もう1つのオプション(より良い/クリーンなオプションIMHO)は、この値をフォームに渡すことです。したがって、GETアクションでTempDataに再度設定するのではなく、このTempData値をフォーム要素内に保持し、フォームが送信されると、この値がHttpPostアクションメソッドに送信されます。アクションメソッドにパラメータを追加してこれを読み取ることができます。あなたの出撃ビュー形式でそう

@using (Html.BeginForm()) 
{ 
    <input type="text" value="@TempData["iddemande"]" name="iddemande" /> 
    <input type="submit" value="submit" /> 
} 

そして、あなたのHTTPのPOSTアクションセッションについて

[HttpPost]   
public ActionResult Sortie(DemandeViewModel postData,int iddemande) 
{ 
    // You can use the value of iddemande 
    // to do : Return something 
} 

で、それは限り、あなたはそれを正しく読んでいるように動作するはずです。セッションが終了するまで、セッション値は設定された後、すべての要求で使用可能になります。

+0

ありがとう、それはセッションを正しく使って私のために働く..ありがとう。あなたは "私のコード"を保存しました^^ – oumaima

関連する問題