23

現在、ASP.NETMVCでWebサイトの管理バックエンドを構築しています。

ASP.NET MVCアプリケーションでは、次のような「EditorFor」ヘルパーメソッドの使用を開始しました。

<div id="content-edit" class="data-form">
    <p>
        <%= Html.LabelFor(c => c.Title) %>
        <%= Html.TextBoxFor(c => c.Title)%>
    </p>
    <p>
        <%= Html.LabelFor(c => c.Biography) %>
        <%= Html.EditorFor(c => c. Biography)%>
    </p>
</div>

モデルでは、「Biography」フィールドは[UIHelper( "Html")]で装飾されています。

'Html'部分ビュー(Views / Shared / EditorTemplatesの下)があります:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>

<textarea class="html">
    <%= Model.ToString() %>
</textarea>

次に、次のように、「textarea」の「ID」属性をフィールドの名前に設定します。

<textarea id="Biography" class="html">
    ...
</textarea>

しかし、現在の設定ではそれを行う方法がわかりません。

私が考えることができるのは、「Value」プロパティと「ControlID」プロパティを含む「Html」ViewModelを作成することだけです。

しかし、「System.XML.Linq.XElement」ではなく、これに基づいてビューを作成すると、「EditorFor」ヘルパーメソッドとの互換性がなくなり、すべてを手動で行う必要があります。

誰かが同じような問題を抱えていますか?

4

3 に答える 3

37

ビューのViewData.TemplateInfo.HtmlFieldPrefixプロパティから目的のIDを引き出すことができるはずです。このような:

<%@ Control Language="C#"
      Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
    <%= Model.ToString() %>
</textarea>

これが機能する理由を示すために、(MVC2プレビュー1ソースの)TemplateHelpers.csで、エディターテンプレートコントロール用にViewDataが初期化される場所を次に示します。

ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) {
    Model = modelValue,
    TemplateInfo = new TemplateInfo {
        FormattedModelValue = formattedModelValue,
        ModelType = modelType,
        HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(expression),
        IsNullableValueType = (underlyingNullableType != null),
    }
};

上記の呼び出しでは、「式」は編集中のプロパティの名前で初期化されます(呼び出しスタックのさらに上)。

ところで、以下の@Sperlingは、私が最初に見逃した詳細を捉えました。デフォルト以外を使用している(または使用する可能性がある)場合は、プロパティHtmlHelper.IdAttributeDotReplacementのドットを。に置き換えます。HtmlPrefixHtmlHelper.IdAttributeDotReplacement

于 2009-09-30T06:32:22.037 に答える
4

これを使用してid(モデルプレフィックス付き)を生成しています。name属性が必要な場合は、.Replace()の部分をスキップしてください。

<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>
于 2009-09-30T13:33:03.387 に答える
0

私たちの場合Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldNameExpressionHelper.GetExpressionText

これはかみそりで次のように使用されました:

           // hiddenFor was caching the value of this html input, and the value alone, nothing else on the page!
            Expression<Func<Web.ViewModels.ApiSettingsViewModel, int>> expression = (m => m.OrgApiLoginCredentials[i].OrgApiLoginId); 
        }
        <input type="hidden" value="@Model.OrgApiLoginCredentials[i].OrgApiLoginId" name="@Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression))" class="data-org-api-login-id"/>
于 2014-12-08T14:39:56.360 に答える