0

MVC アプリケーションには、いくつかの DropDownLists があります。コントローラーで を作成IEnumerable<SelectListItem>し、ビューに転送します。残念ながら、検証エラーが発生した場合は、それらのリストを再作成する必要があります。そうしないと、ビューのレンダリングが失敗します。

私がやっているコントローラーアクションメソッドで:

var possibilities = _repo.Objects.Select(o=>new SelectListItem(...));
viewmodel.Possibilities = possibilities;
return View(viewmodel); 

ビューモデルには、次のように定義された Possibilities プロパティがあります。

IEnumerable<SelectListItem> Possibilities { get; set; }

そして私の見解では、私はそれにアクセスします:

@Html.DropDownListFor(vm=>vm.ThePossibility, vm.Possibilities)

問題は、フォーム ポスト アクション メソッドが呼び出されたときに、渡されたビュー モデルに null が含まれているためPossibilities、次のように呼び出した場合:

if(!ModelState.IsValid)
    return View(model);

ビューはレンダリングされません。

ポスト アクション メソッドでプロパティが null である理由は理解できますが、これを修正する最善の方法は何ですか? これらのリストを再初期化したくありません。

ありがとう。

4

4 に答える 4

1

私は通常、これらをどこかにキャッシュするか、共通リストを取得するための静的クラスを提供します。次に、ゲッターを使用してモデル内のこれらへのアクセスを提供できます。

例えば:

IEnumerable<SelectListItem> _possibilities 
IEnumerable<SelectListItem> Possibilities 
{ 
   get
   {
       if (_possibilities == null)
           _possibilities = CommonLists.Possibilities();

       return possibilities;
   }
}
于 2012-10-02T21:04:18.007 に答える
1

Post-Redirect-Get パターンの使用を検討する必要があります。ASP.Net MVC でこれを非常に簡単に実行できるようにする、このブログ投稿で説明されている優れた属性のペアがあります。

于 2012-10-02T21:02:33.203 に答える
1

リストを再初期化したくない場合は、セッションなどのどこかにリストをキャッシュする必要があります。

率直に言って、ほとんどの場合、それらを再構築する方が簡単です。毎回それらを再割り当てする必要があります。

于 2012-10-02T20:58:01.580 に答える
0

アクセサーと JSON ( NetwonSoft ) はあなたの友達です。

手短に

  1. モデルsetのプロパティを取得する場合は、パブリック文字列プロパティにシリアル化します。IEnumerable<SelectListItem>
  2. パブリック文字列プロパティがsetであり、IEnumerable<SelectListItem>が定義されていない場合 (null など)、文字列プロパティをモデルのプロパティに逆シリアル化します。IEnumerable<SelectListItem>
  3. ビューにシリアライズされた文字列を埋め込み、サーバーへの投稿間で保持されるようにします。(例@Html.HiddenFor(...))

モデル

public class MyViewModel
{
    public IEnumerable<SelectListItem> Selections
    {
        get
        {
            return selections;
        }
        set
        {
            selections= value;
            // serialize SelectListItems to a json string
            SerializedSelections = Newtonsoft.Json.JsonConvert.SerializeObject(value);
        }
    }
    IEnumerable<SelectListItem> selections;

    public string SerializedSelections
    {
        get
        {
            return serializedSelections;
        }
        set
        {
            serializedSelections = value;
            if(Selections == null)
            {
                // SelectListItems aren't defined.  Deserialize the string to the list
                Selections = Newtonsoft.Json.JsonConvert.DeserializeObject<IEnumerable<SelectListItem>>(value);
            }
        }
    }
    string serializedSelections;
}

レーザービュー

<form>
...
@Html.HiddenFor(m => m.SerializedSelections)
...
@Html.DropDownListFor(m => m.SomeProperty, Model.Selections)
</form>
于 2015-11-20T06:14:13.467 に答える