0

私は次のViewModelを持っています:

 public class ViewModel
    {
        public Address Address {get;set;}
        [DisplayName("State")]
        public IEnumerable<SelectListItem> StateSelect { get; set; }
        public string StateID { get; set; }


        public ViewModel()
        {
        }

        public ViewModel(Stuff s, IDataContext dc)
        {
            StateSelect = dc.States.ToList().Select(x => new SelectListItem
                                                             {
                                                                 Value = x.Id.ToString(),
                                                                 Text = x.Name
                                                             });
           Address = s.Address;


        }

そして私の編集ビューで:

<div class="display-field">
                @Html.DropDownListFor(model => model.Address.StateID, Model.StateSelect,)
                @Html.ValidationMessageFor(model => model.StateSelect)
            </div>

私のコントローラー:

public ActionResult Edit(int id)
        {
            var stuff = context.Stuff.Find(id);
            if (stuff== null)
            {
                throw new Exception("Stuff not found.");
            }
            return View(new ViewModel(stuff, context));
        }

        [HttpPost]
        public ActionResult Edit(ViewModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    //deeper logic, adds to ModelState.AddModelError
                    if(stillNotValid)
                         return View(model)
                }
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

これで、私のEditビューでは、ドロップダウンリストが正しく表示されます。ただし、Editコントローラーに投稿すると、モデルには常にnullのStateSelectが含まれます。

Edit検証エラーが発生した場合にドロップダウンを再入力できるように、StateSelectが自分の投稿にプッシュされていることを確認するにはどうすればよいですか?

4

3 に答える 3

1

<form />コレクションをサーバーにリクエストして投稿するには、コレクションをの中に入れる必要があります。この場合、ほとんどの場合、非表示の入力を使用して「手作業で」マークアップを作成するか、非表示のブロック内にマークアップを配置してユーザーから非表示にする必要があります。

このコレクションをビューモデルに含めるためだけに、このリストを前後に送信してもよろしいですか?別の解決策があります-このリストをViewBagのビューに送信し、アクションにバインドします。これにより、<form />モデリングができなくなり、POSTリクエストのサイズが小さくなります。

于 2012-11-12T19:24:50.030 に答える
0

StateSelectをコントローラーに投稿するには、その要素を特別な名前の非表示フィールドに書き込む必要があります(これを行う方法を参照してください)。ただし、このIEnumerableは、投稿後にコントローラーアクションの編集で補充できます。それは正しい決断になります。

于 2012-11-12T19:32:46.323 に答える
0

さまざまな理由から、このようなブラウザリクエスト間でデータを保持することは避けたいと思います

  1. HTTPはステートレスになるように設計されており、フォームを可能な限りステートレスになるように開発すれば、適切に拡張できます。
  2. そのような形式で状態情報を追加することは、サーバー上での構築に時間がかかり、クライアントへの転送に時間がかかり、ブラウザーでのレンダリングに時間がかかる不要なHTMLを生成することを意味し、全体的にパフォーマンスに大きな打撃を与えます(ただし、反論することはできます) 「リクエスト圧縮」などを使用)
  3. クライアント側で実行されているようなjQueryを使用している場合、DOMにHTMLが多すぎるため、DOMの解析が非効率になります。

そうは言っても、データが少量で、ユーザーがフォームでどのように終了したか、またはウィザードユーザーがどれだけ完了したかなどを追跡するために使用される場合、Cookieに非表示の変数の形式である程度のデータ永続性を実装できます。

于 2012-11-12T19:41:53.497 に答える