52346
あるモデルがSelectListItemのプロパティをもっておりGETで、このプロパティに値を入れるとします。  
次にPostすると、Controller側に帰ってくるときにSelectListItemがnullで帰ってきます。

この場合、どのような対応をするのが一番良いでしょうか。  
私が考えているのは以下の通りです。  
1\. Getで行った処理と同じSelectListItemに値を入れることをする。  
2\. Get時点でTempDataなどに一度退避しておき、Post時点でTempDataから値をもらう。

その他に方法があればご教授ください。  
よろしくお願いします。
CC BY-SA 4.0
2019-01-21T00:46:32.920
52152
2019-01-27T04:21:54.203
12388
question
c# asp.net mvc
ASP.NET MVCでPOSTした後にModelのSelectListItemがnullになる。
そのモデルがどういClassなのか、行いたい処理のロジックも  
はっきりわからないので非常に回答しづらいと思います。

もし、Get でクライアントに送ったデータをPost処理でサーバに取りたいのなら  
Post処理専用の ViewModel を作るとよいのではないかと思います。
CC BY-SA 4.0
2019-01-27T01:03:41.200
52346
2019-01-27T01:03:41.200
31940
52152
answer
余計なお世話かもしれませんが、これ「GETで、このプロパティに値を入れるとします。」がそもそも良くないのでは？

これは削除の質問で、質問自身でも書いていますが。  
[asp.net-mvc submit 仕組み - GETではなく、HTTP
POSTまたはDELETEを使用して削除する必要があるのはなぜですか?](https://code.i-harness.com/ja/q/bfe96)

>
> いくつかの方法（例えば、HEAD、GET、OPTIONS、TRACE）は安全と定義されています。つまり、情報の取得のみを目的としており、サーバーの状態を変更すべきではありません。

* * *

@松田俊さん回答の対応も組み合わせて、以下のように考えられると思います。

1.SelectListItemが変更を許す値の場合。

POSTを行う際に クライアント側でJavaScriptによる値の有効性チェック処理を組み込んでおく。  
無効な値ならばPOSTを行わない。

2.SelectListItemが変更されたくない値の場合。  
→質問の2.に相当し、以下のいずれか。

a.セッション管理を行い、セッション変数(TempData)に値を保持しておく。  
b.隠しinputフィールド(TempData)に値を入れておく。

ただし、セッション管理だとクライアント側で Cookie を受け入れる設定が必要かも？  
[ログインでセッションをつかうのか？ for ASP.NET MVC5](https://tech.exceedone.co.jp/asp-
net/session-cookieless-session-for-asp-net-mvc5/)

隠しinputフィールドは、idとnameを同一に設定しておく必要があるそうです。  
[asp.net-mvc redirecttoaction 引数 -
mvcのコントローラから隠しフィールドの値を設定する方法](https://code.i-harness.com/ja-jp/q/1016dab)  
[c# ヘルパー htmlヘルパー - ASP.NET
MVC:隠しフィールド値がHtmlHelper.Hiddenを使用してレンダリングされない](http://code.i-harness.com/ja/q/1ecf3b)
CC BY-SA 4.0
2019-01-27T04:21:54.203
52350
2019-01-27T04:21:54.203
26370
52152
answer