ViewDataDictionary
1行のコードでモデルと追加のプロパティを使用して を作成する方法はありますか? RenderPartial
複数行にわたって ViewDataDictionary を明示的にアセンブルせずに、モデルといくつかの追加の表示構成プロパティの両方をアセンブルしながら、厳密に型指定されたビューを呼び出そうとしています。RenderPartial
モデルobject
と a の両方を使用するオーバーロードを考えると、それは可能であるように思われますが、両方ViewDataDictionary
が設定されている場合は単に を無視するように見えViewDataDictionary
ます。
// FAIL: This will result in ViewData being a ViewDataDictionary
// where Model = MyModelObject and there are no other parameters available.
this.Html.RenderPartial("SomePartialView", MyModelObject, new ViewDataDictionary(new { SomeDisplayParameter = true }));
同じ問題を抱えている他の人を見つけましたが、彼らの解決策は、私が見つけたのと同じ複数行の概念です。ViewDataDictionary
モデルで離散を作成し、新しいパラメーターを追加して、RenderPartial
呼び出しで使用します。
var SomeViewData = new ViewDataDictionary(MyModelObject);
SomeViewData.Add("SomeDisplayParameter", true);
this.Html.RenderPartial("SomePartialView", SomeViewData);
ChainedAdd
新しい要素が追加された重複した辞書を返すメソッドにそのロジックをいつでもラップできますが、ViewDataDictionary
これを行う を作成する方法が欠けているようです (そして、それは私が望んでいたよりも少し多くのオーバーヘッドです)為に)。
this.Html.RenderPartial("SomePartialView", new ViewDataDictionary(MyModelObject).ChainedAdd("SomeDisplayParameter", true));
public static ViewDataDictionaryExtensions {
public static ViewDataDictionary ChainedAdd(this ViewDataDictionary source, string key, object value) {
return source.ChainedAdd(new KeyValuePair<string,object>(key, value));
}
public static ViewDataDictionary ChainedAdd(this ViewDataDictionary source, KeyValuePair<string, object> keyAndValue) {
ViewDataDictionary NewDictionary = new ViewDataDictionary(source);
NewDictionary.Add(keyAndValue);
return NewDictionary;
}
}
同様に、ModelState が読み取り専用であるためViewDataDictionary
、明示的Model
でModelState
単純にアセンブルしようとすると、コンパイル エラーが発生します。
// FAIL: Compilation error
this.Html.RenderPartial("SomePartialView", new ViewDataDictionary { Model = MyModelObject, ModelState = new ViewDataDictionary( new { SomeDisplayParameter = true }});
ANSWER(S): Craig と私は、仕事を成し遂げる 2 つの別々の構文を見つけたようです。この場合、私は間違いなく偏っていますが、最初にモデルを設定してから「装飾」するというアイデアが好きです。
new ViewDataDictionary(MyModelObject) { { "SomeDisplayParameter", true }, { "SomeOtherParameter", 3 }, { "SomeThirdParameter", "red" } };
new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }})
{ Model = MyModelObject };
もちろん、彼の[最終的には的確な]回答がなければ、私はまだ車輪を回転させているので、円は四角になります.