[解決済み] ASP.NET MVC部分表示:入力名のプレフィックス
質問
例えば、以下のようなViewModelがあるとします。
public class AnotherViewModel
{
public string Name { get; set; }
}
public class MyViewModel
{
public string Name { get; set; }
public AnotherViewModel Child { get; set; }
public AnotherViewModel Child2 { get; set; }
}
ビューの中で
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
パーシャルでは
<%= Html.TextBox("Name", Model.Name) %>
or
<%= Html.TextBoxFor(x => x.Name) %>
しかし、問題は、モデルバインダーが正しく動作するためには name="Child.Name" を持つ必要があるのに、両方とも name="Name" をレンダリングしてしまうことです。または、同じ部分ビューを使用して2番目のプロパティをレンダリングすると、name="Child2.Name"が表示されます。
部分ビューで必要な接頭辞を自動的に認識させるにはどうすればよいですか。パラメータとして渡すことはできますが、これはあまりにも不便です。たとえば、再帰的にレンダリングしたい場合、これはさらに悪いことです。部分ビューをプレフィックス付きでレンダリングする方法、あるいはさらに良い方法は、呼び出したラムダ式を自動的に再定義して
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
は、生成された名前/ID文字列に自動的に正しい"Child."接頭辞を追加しますか?
私は、3rd パーティーのビューエンジンおよびライブラリを含む、任意のソリューションを受け入れることができます - 私は実際に Spark View Engine (私はそのマクロを使用して問題を解決します) および MvcContrib を使用しますが、そこでソリューションを見つけられませんでした。XForms、InputBuilder、MVC v2 - この機能を提供する任意のツール/洞察は素晴らしいものになるでしょう。
現在、私はこれを自分でコーディングすることを考えていますが、それは時間の無駄のように思えます、このつまらないものがすでに実装されていないとは信じられません。
多くの手動ソリューションが存在する可能性があり、それらのすべてが歓迎されます。たとえば、私のパーシャルは IPartialViewModel<T> { public string Prefix; T Model; } に基づいていることを強制することができます。しかし、私はむしろいくつかの既存の/承認されたソリューションを好むでしょう。
UPDATE: 答えのない同様の質問があります。 はこちら .
どのように解決するのですか?
Htmlヘルパークラスは、このように拡張することができます。
using System.Web.Mvc.Html
public static MvcHtmlString PartialFor<TModel, TProperty>(this HtmlHelper<TModel> helper, System.Linq.Expressions.Expression<Func<TModel, TProperty>> expression, string partialViewName)
{
string name = ExpressionHelper.GetExpressionText(expression);
object model = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model;
var viewData = new ViewDataDictionary(helper.ViewData)
{
TemplateInfo = new System.Web.Mvc.TemplateInfo
{
HtmlFieldPrefix = name
}
};
return helper.Partial(partialViewName, model, viewData);
}
で、これをビューで次のように使用します。
<%= Html.PartialFor(model => model.Child, "_AnotherViewModelControl") %>
をクリックすると、すべてがうまくいっていることがわかるでしょう
関連
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み] ASP.NET MVC Frameworkで複数のサブミットボタンを処理する方法は?
-
[解決済み] ASP.NET MVCでenumからドロップダウンリストを作成するにはどうすればよいですか?
-
[解決済み] ASP.NET MVC - カスタムIIdentityまたはIPrincipalの設定
-
[解決済み] ASP.NET MVCでビューをコンパイルする
-
[解決済み] ELMAHをASP.NET MVCの[HandleError]属性で動作させる方法は?
-
[解決済み] ASP.NET MVCのビューを文字列としてレンダリングする方法は?
-
[解決済み] JSONまたは部分的なhtmlを返すASP.NET MVCコントローラのアクション
-
[解決済み] ASP.NET MVC ビューエンジンの比較
-
[解決済み] ASP.NET MVCにおけるセッション変数
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] System.Web.HttpException (0x80004005)。リクエストの最大長を超えました
-
[解決済み] OwinStartupが起動しない
-
[解決済み】MVCアプリケーションでデータをキャッシュする方法
-
[解決済み】ASP.NET MVC Html.ValidationSummary(true) でモデルエラーが表示されない。
-
[解決済み】ASP.NET MVC 3 - 部分テンプレートと表示テンプレートと編集テンプレート
-
[解決済み】ViewModelのベストプラクティス
-
[解決済み] asp.net mvc: なぜ Html.CheckBox は追加の隠された入力を生成するのですか?
-
[解決済み] セキュリティ透過的なメソッド 'WebMatrix.WebData.PreApplicationStartCode.Start()' による試行。
-
[解決済み] ASP.NET MVC: UrlHelperを使用するコントローラのユニットテスト
-
[解決済み] アクションリンクでエリア名を指定するには?