2017-11-17 6 views
0

ビューのGETリクエストで 'plate'オブジェクトをインスタンス化し、フォームがポストされるときにアクセスします。プレートオブジェクトには、フォームからのデータが入力されます。また、渡された座標を格納するために使用できますか?あるいは私が達成しようとしていることをする慣用的な方法は何ですか?ASP.NET MVC 5:コントローラの永続変数

ありがとうございます! HTTPはステートレスであるため、あなたが見る何

public class DrawingController : Controller 
{ 

     Plate plate; 

     [HttpGet] 
     public ActionResult Index() 
     { 
      plate = new Plate() 
      { 
       Holes = new Holes() 
      } 
      return View(plate); 
     } 

     // called by ajax when user clicks on "Save" to save the input coordinates 
     [HttpPost] 
     public void PassCoordinates(string coordinates) 
     { 
      // why is plate null here? 
      plate.Holes.coordinates = coordinates; 
     } 

     [HttpPost] 
     public ActionResult Index(Plate plate) 
     { 
     // I want to access plate.Holes.coordinates that I set in 'PassCoordinates' 
     // how can I achieve this? 
     } 
} 
+0

静的変数として 'plate'を設定することができます。しかしそれでも、あなたはここで深刻な競争状態の問題を起こすことになる。通常、値を格納するとは、何らかのデータベースまたはキャッシュ機構を介して永続化することを意味します。 – nurdyguy

+0

なぜ2つのポストメソッドがありますか? Index.cshtmlを提供できますか? – 0014

+0

@ 0014、PassCoordinates(文字列座標) 'がajaxによって呼び出され、' Index(Plate plate) 'がフォーム送信時に呼び出されます。 – user3453636

答えて

1

は、正常な動作です。

アクションメソッドを呼び出すたびに、コントローラの新しいオブジェクトが作成されます。したがって、あなたの場合、ajax呼び出しを行うと、DrawingControllerの新しいオブジェクトが作成され、このオブジェクトはPlateというタイプのプロパティを持ちますが、Plateオブジェクトに初期化されません。 (あなたはIndexメソッド呼び出しで行う

あなたは同じプレートのインスタンスを取得したい場合、あなたはさまざまな方法で

  1. を行うことができますPassCoordinatesアクションメソッドであなたのAJAX呼び出しのポストを持っていますjsのプレート構造のオブジェクトで、アクションメソッドのパラメータはPlateタイプです。要求がサブミットされると、モデルバインダーは新しいオブジェクトを構築し、異なるプロジェクトの値をマップすることができます。

  2. プレートオブジェクトを永続メディウムに格納して読み取ります。したがって、あなたのIndexアクションメソッドでは、オブジェクトを作成し、プロパティ値を初期化し、dbテーブル/セッション状態などに格納します。これは、2番目のアクションメソッドでこの場所から再度読み取ることができます。あなたはオプション#2のために行くとあなたがステートレスでhttp ステートフル動作を追加しようとしていることに注意してください、セッション/静的変数を使用することを選択している場合は、静的変数を使用すると、別のオプション

です。 :

IMHO、オプション1を使用する方法Httpのステートレスな動作を維持するクライアントコード(ajax呼び出しを行うコード)でプレートオブジェクトを表すJSオブジェクトを送信し、モデル

私があなたのコードを見ているときは、PassCoordinatesメソッドが実行しているのは、単にコントローラの中で利用可能なPlateオブジェクトのHoles.coordinatesプロパティ値を設定することだけです。そのメソッドを完全に削除し、フォームの入力要素でそれを行うようにして、フォームをHttpPostインデックスアクションメソッドに送信するときに、要求ボディとモデルバインドで利用できるようにしますそれをPlateパラメーターにマップします。

@model Plate 
@using (Html.BeginForm("Index", "Home")) 
{  
    @Html.TextBoxFor(a=>a.Holes.coordinates)  
    <button type="submit" class="btn" >Save</button>  
} 

これは、フォーム内に名前Holes.coordinatesの入力要素を作成します。

<input id="Holes_coordinates" name="Holes.coordinates" type="text" value=""> 

値を入力してフォームを送信してください。 HttpPostアクションメソッドにブレークポイントを設定すると、プレートオブジェクトHole Proretyが入力され、coordinatesプロパティのテキストボックスに入力した値にアクセスできることがわかります。

これで、ajax呼び出しを行う代わりに、クライアントサイドのコードがどんなものであれ、この入力の値を設定するだけです。

$("#Holes_coordinates").val("some value you want"); 

すべてが動作したら、あなたは、単にHiddenForヘルパーへのコールを切り替えることにより、非表示の入力に見えるテキストボックスを変換することができます。

@Html.HiddenFor(a=>a.Holes.coordinates) 
+0

あなたの有益なコメントありがとう:)私は文字列の座標にHTMLリストを渡していると私はPassCoordinates(コードはここには表示されません)で解析し、まだフォームが送信されるときにそれを投稿するのが最善のことです。しかし私はそれをする方法を知らない。あなたのポイント#2では、ajax呼び出しが行われると、モデルオブジェクトはまだ完全に生成されていません。私がフォームを提出すると、それは上書きされますか、いいえ? – user3453636

+0

私は動作するはずのサンプルコードで答えを更新 – Shyju

+0

ありがとう!もし私の問題が解決すれば、すぐにあなたに知らせておきます。 – user3453636

1

各ユーザーのために要求間で状態を維持したい場合は

  • 使用TempDataを収集し、あなたが値を毎回設定することを確認します。それらは次回のリクエストでのみ利用可能となり、複数のリクエストを受けたい場合は、毎回リクエストを設定する必要があります。
  • 利用ユーザの現在のセッションの値を格納するためのセッション:メモリデータベース内のデータベース内のクッキー
  • ストアそれで https://msdn.microsoft.com/en-us/library/ms178581.aspx
  • ストアそれクエリ文字列に
  • ストアそれ
  • 店もまたはキャッシングサービス
  • モデルから次の返されたcshtmlページに値を返し、次の投稿から次のリクエストで渡されるように値を入力フォームフィールドに配置します。

各方法には長所と短所があり、さらに詳しい情報がなければ、適切な選択肢が何であるかを判断するのは難しいです。

+0

あなたの答えをありがとう!間違いなくこれを心に留めておきます:) – user3453636

関連する問題