7

私は EditorFor を持っています:

<%: Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false })%>

これにより、(予想どおり) 正常にビューにバインドされますが、モデルがポストされたときにバインドがバインドされません。これは、フォーム ID の先頭に「クライアント」が付いていないためです。

通常、この状況では、モデルを渡し、入力をテンプレートの model.Client.PropertyName にバインドしますが、この場合、テンプレートが 2 つの異なるビューモデル (クライアントがオンになっている) で使用されるため、これはオプションではありません。

これを適切にバインドするための提案はありますか?

どうもありがとう、コーハン。


補遺

これは私の誤解だったようです。私が理解している問題は、fluentHtml が EditorFor Templates 内で機能しないことです。(同じことがこの修正にも当てはまります。これは、fluentHtml を通常の mvc html ヘルパーに置き換えると、EditorFor が自動的にプレフィックスを付けてくれるため、不要であることが判明しました)

4

2 に答える 2

11

次のようなものを試してください:

<% Html.BeginHtmlFieldPrefixScope("Client") {
  Html.EditorFor(model => model.Client, "ClientTemplate", new { editing = false });
<% } %>

EditorFor、LabelFor などで作成するすべてのフィールドにはプレフィックスが付けられます。

編集:これが私が使用している拡張メソッドです。申し訳ありません!

public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
{
  return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
}

...そしてクラス...

private class HtmlFieldPrefixScope : IDisposable
{
    private readonly TemplateInfo templateInfo;
    private readonly string previousHtmlFieldPrefix;

    public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
    {
        this.templateInfo = templateInfo;

        previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
        templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
    }

    public void Dispose()
    {
        templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
    }
}

以下のコメントでコーハンが言及したリンクを参照してください。

于 2011-01-05T16:51:22.037 に答える
6

MVC3 HTML 名の衝突

MVC3 では機能しない切り取りと貼り付け。拡張機能を機能させるには、クラス ファイルを作成する必要がありました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace incMvcSite.Classes {
    public static class HtmlPrefixScopeExtensions {
        public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix) {
            return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
        }

        private class HtmlFieldPrefixScope : IDisposable {
            private readonly TemplateInfo templateInfo;
            private readonly string previousHtmlFieldPrefix;

            public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix) {
                this.templateInfo = templateInfo;

                previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
                templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
            }

            public void Dispose() {
                templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
            }
        }
    }
}

Razor (.cshtml) ファイルに、次を追加しました。

@using incMvcSite.Classes
@using(Html.BeginHtmlFieldPrefixScope("Permission")) {
    <fieldset>
        <legend>Permission</legend>

        // The Html.EditorFor's would go here...
    </fieldset>
}

拡張クラスをスコープに入れるために使用していることに注意してください。これにより、2 番目の using 行が機能します。

問題は、ポストバック時にオブジェクトが更新されないことです。私のコントローラーでは、2 番目のパラメーターを使用してプレフィックスを指定しました。

TryUpdateModel(modelUser.Permission, "Permission");

これにより、HTML のすべてのフィールドにプレフィックスが追加され、TryUpdateModel はプレフィックス付きのコントロール名でオブジェクトをロードしました。埋め込まれた編集リスト、および同じプロパティ名を持つモデルの部分ビューのコントロールに適切に名前を付けることができるようになりました。

于 2011-07-30T21:23:39.477 に答える