ASP.NET MVC 部分ビュー: 入力名プレフィックス 質問する

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.」プレフィックスが自動的に追加されますか?

サードパーティのビュー エンジンやライブラリを含むあらゆるソリューションを受け入れることができます。私は実際に Spark View Engine (マクロを使用して問題を「解決」) と MvcContrib を使用していますが、そこではソリューションが見つかりませんでした。XForms、InputBuilder、MVC v2 など、この機能を提供するツールやインサイトはどれでも結構です。

現在、これを自分でコーディングしようかと考えていますが、時間の無駄のように思えます。この些細なことがまだ実装されていないなんて信じられません。

手動ソリューションは多数存在する可能性があり、それらはすべて歓迎されます。たとえば、部分を IPartialViewModel<T> { public string Prefix; T Model; } に基づいて強制することができます。ただし、既存の/承認済みのソリューションの方が好ましいです。

更新: 回答のない同様の質問がありますここ

ベストアンサー1

次のようにして 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") %>

すると、すべてが正常であることがわかります。

おすすめ記事