.NET MVC でフォーム値をコントローラーに渡す方法
-
21-08-2019 - |
質問
ASP.net MVC の場合:
フォーム データ (ビューから) をコントローラーにどのように渡す必要がありますか、または渡すことができますか?
これが私が向かっている道です:
- コントローラー インデックス関数は、ViewModel オブジェクトをビューに渡します。
- ViewModel オブジェクトには、ページ分割されたリストといくつかの SelectList が含まれています。_ ViewModel オブジェクトには、theFilter という名前のカスタム クラスも含まれています。このクラスの目的は、ビューからフォーム経由で投稿されたフィルター情報を保持することです。
- Index [AcceptVerbs(HttpVerbs.Post)] 関数で、フォーム データとページ番号が入力された theFilter オブジェクトを受信できるようにしたいと考えています (現時点では)。
私のコードのスニペットは次のとおりです。
コントローラー/インデックスのポストバック関数:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int? page, CaseFilter caseFilter)
{
const int pageSize = 10;
var cases = caseRepo.FindAllCases();
var paginatedCases = new PaginatedList<Case>(cases, page ?? 0, pageSize);
return View(new CaseIndexViewModel(paginatedCases, caseFilter));
}
フィルタークラス:
public class CaseFilter
{
int iVolume_id = 0,
iSubject_id = 0;
public CaseFilter() {
}
public int Volume_id { get { return iVolume_id; } set { iVolume_id = value; } }
public int Subject_id { get { return iSubject_id; } set { iSubject_id = value; } }
}
そして ViewModel クラス:
public class CaseIndexViewModel
{
public PaginatedList<Case> PaginatedCases { get; private set; }
public CaseFilter CaseFilter { get; private set; }
public CaseIndexViewModel(PaginatedList<Case> paginatedCases, CaseFilter caseFilter)
{
PaginatedCases = paginatedCases;
CaseFilter = caseFilter;
}
}
基本的に、Request.Form を使用して Filter クラスを設定することは避けようとしています。少なくともコントローラー内では使用しないようにしています。
助け、提案、ディスりは大歓迎です。
解決 4
最後に、私もリクエストのコレクションを使用する必要はありません。私は
内のパラメータとして設定されCaseFilterオブジェクトが自動的に充填されますpublic ActionResult Index(int? page, CaseFilter caseFilter)
そのまま上記のコードは動作します。
他のヒント
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection collection)
{
string valueFromNameTextBox = collection["name"];
}
あなたは、フォーム上のすべての入力の名前を持つこのコレクションにインデックスをすることができます。
というよりも、私のメソッドのシグネチャを複雑に、私はValueProviderプロパティを使用して撮影した値は、単純なプロパティでない限り、フォーム/ルート値を取得するために、コントローラに/のUpdateModelをしてみました。一方、私はおそらくまた、表示のためのモデルのフィルター部分をすることはないだろう - 私は、ページのために、モデルの狭い概念を持っている傾向がある、それはかなりのビジネスのになりたいですモデルではなく、そのページ上のすべてのデータのモデル - 。単にViewDataを介して、フィルタ値を渡すでしょう。
あなたはこのような何かを行うことによって、フォーム内のすべての要素を通過することができ、BFreeの答えを展開します:
foreach (string key in collection.keys) {
if (key.contains("blah"))
text1 = collection[key];
}
それがあればkey.containsためにあまりにも多くの要素を持っている場合は、、それはしかし少し醜い得るので、注意してくださいすることができます;)
所属していません StackOverflow