1

ASP.net MVC の場合:

フォーム データ (ビューから) をコントローラーに渡すにはどうすればよいですか?

これは私が向かっている方法です:

  • Controller Index 関数は、ViewModel オブジェクトをビューに渡しています。
  • ViewModel オブジェクトには、ページ分割されたリストといくつかの SelectLists が含まれています。_ ViewModel オブジェクトには、theFilter という名前のカスタム クラスも含まれています。このクラスの目的は、フォームを介してビューから投稿されたフィルター情報を保持することです。
  • Index [AcceptVerbs(HttpVerbs.Post)] 関数で、フォーム データが入力された Filter オブジェクトとページ番号を受け取るようにしたい (現在はそのまま)

ここに私のコードのスニペットがあります:

コントローラー/インデックスのポストバック関数:

    [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 クラスにデータを入力することを避けようとしています。少なくとも Controller 内で使用しないようにしています。

ヘルプ、提案、またはディスは大歓迎です!

4

4 に答える 4

6
[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(FormCollection collection)
    {
         string valueFromNameTextBox = collection["name"];
    }

フォーム上のすべての入力の名前を使用して、このコレクションにインデックスを付けることができます。

于 2009-03-20T21:10:03.340 に答える
0

メソッドのシグネチャを複雑にするのではなく、値が単純なプロパティでない限り、コントローラーでValueProviderプロパティとTry / UpdateModelを使用して、フォーム/ルート値を取得することにしました。一方、ビューのモデルのフィルター部分も作成しない可能性があります。ページのモデルの概念が狭くなる傾向があり、すべてのモデルではなくビジネスモデルになりたいと考えています。ページ上のデータ-そしてViewDataを介してフィルター値を渡すだけです。

于 2009-03-20T21:17:06.040 に答える
0

BFreeの答えを拡張するには、次のようにしてフォーム内のすべての要素を確認できます。

foreach (string key in collection.keys) {
   if (key.contains("blah"))
      text1 = collection[key];
}

key.contains ifの要素が多すぎると、少し醜くなる可能性があるので注意してください;)。

于 2009-03-20T21:19:14.537 に答える
0

最後に、Request Collection を使用する必要さえありません。CaseFilter オブジェクトは、パラメーターとして設定すると自動的に入力されます

public ActionResult Index(int? page, CaseFilter caseFilter)

上記のコードはそのまま動作します。

于 2009-03-23T12:55:40.277 に答える