2017-02-10 9 views
0

私のアプリケーションには2つの画面があります。最初のユーザーは、TempDataオブジェクトを使用して次のコントローラに渡される2つの値を選択します(Sessionオブジェクトは使用できません)。ページの更新時にコントローラのモデルを取得する方法

次に、2番目のページのコントローラーで、これらの値を読み取り、それらを新しいモデルに割り当てます。これは、ユーザーがページを更新しない限り完全に機能します。この場合、TempDataの変数が失われ、モデルには値が含まれなくなります。

最初のコントローラのアクション(あなたが選択リストから2番目の項目を選択した場合)

[HttpPost] 
public ActionResult Select(ProductSelector model) 
{ 
    if (!ModelState.IsValid) 
    { 
     ProductSelector newModel = InitialiseProductSelectorModel(); 
     newModel.ProductId = model.ProductId; 
     newModel.StatusId = model.StatusId; 
     return View("ProductSelector", newModel); 
    } 
    TempData["StatusId"] = model.StatusId; 
    TempData["ProductId"] = model.ProductId; 
    return RedirectToAction("Create", "ProductDetails"); 
} 

私の第二のコントローラのアクションは、次のようになります。

[HttpGet] 
public ActionResult Create() 
{ 
    int ProductId, StatusId; 
    // Get ProductId and StatusId from product selector screen 
    int.TryParse(TempData["ProductId"].ToString(), out ProductId); 
    int.TryParse(TempData["StatusId"].ToString(), out StatusId); 
    model.ProductId = ProductId; 
    model.StatusId= StatusId; 

    return View("OrderCreate", model); 
} 

私はこれを回避するにはどうすればよいですか?私はモデルをパラメータとして取る別のアクションを持っていますが、これはPOSTメソッドです。

+0

MVCパターンがどのように機能し、どのように情報がどのように渡されるかは完全に理解できません。まず、モデルバインディングについてもう少し詳しくお読みください。次に、TempDataを見てください(http://stackoverflow.com/questions/2642062/asp-net-mvc-does-browser-refresh-make-tempdata-useless) –

+0

詳細を教えてください。あるコントローラーから別のコントローラーにデータを渡すことができる唯一の方法は、セッションまたはtempdataを使用するか、またはクエリー・ストリングで渡すことです。同じコントローラ内にあれば、 'return View()'を使用します。 – mikeyq6

+0

いいえ、モデルバインディングでデータを渡します。これは情報を渡すMVCの方法で、ただ検索するだけです。 –

答えて

0

パラメータ

return RedirectToAction("Create", "ProductDetails", 
       new { StatusId = StatusId , ProductId = ProductId }); 

し、次のアクションでを渡すためにこの方法を試して、これらの値を受け取る

public ActionResult Create(int StatusId, int ProductId) 

EDIT ::(クエリ文字列なし)別の方法:あなたのcreate

アクション、データを取得する前にこれを行うTempData

[HttpGet] 
public ActionResult Create() 
{ 
    int ProductId, StatusId; 

    TempData.Keep("ProductId"); // These two lines will keep data 
    TempData.Keep("StatusId"); // upon multiple refreshes 

    int.TryParse(TempData["ProductId"].ToString(), out ProductId); 
    int.TryParse(TempData["StatusId"].ToString(), out StatusId); 
    model.ProductId = ProductId; 
    model.StatusId= StatusId; 

    return View("OrderCreate", model); 
} 
+0

私はクエリー・ストリングを通してデータを渡すことができないことを除いて、それは大丈夫でしょう。 – mikeyq6

+0

@ mikeyq6これは*クエリ文字列にデータを渡すものではありません。これらのルートパラメータが追加されます。ルートが定義されたパラメータを持たないように定義されている場合は、クエリ文字列に追加されます。したがって、パラメータを使用してルートを定義します。 – Amy

+0

どちらの場合でも、データはURLを通過します。ルートを定義すると、キーと値のペアではないことを意味します。上記の場合、 '/ ProductDetails/Create/1/2'と'/ProductDetails/Create/1 /?ProductId = 2'の違いを意味します。いずれの場合でも、パラメータはまだURLに渡されています – mikeyq6

関連する問題