2009-09-27 2 views
22

現在、ASP.NET MVCのWebサイトの管理バックエンドを構築しています。 ASP.NET MVCアプリケーションでは、私はそうのような「EditorFor」ヘルパーメソッドを使用して開始しましたEditorTemplateでフィールド名をレンダリングする(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> 

、「伝記」フィールドは、飾られています[UIHelper( "Html")]。

私は(閲覧/共有/ EditorTemplates下)「HTML」部分図を持っている:

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

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

今私はの名前に設定「テキストエリア」の「ID」属性を持っているしたいのですがフィールドは、このように:

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

しかし、私は現在の設定でそれを行う方法を見ることはできません。

私は、 'Value'プロパティと 'ControlID'プロパティを含む 'Html' ViewModelを作成していると思います。

しかし、私は 'System.XML.Linq.XElement'ではなく、 'EditorFor'ヘルパーメソッドとの互換性がなくなり、手動ですべてを行う必要があります。

誰もまだ同様の問題がありましたか?

+0

ジャスト@ネイサン・テイラーによって求められている同様の質問が見つかりました: //stackoverflow.com/questions/1329148/asp-net-mvc-solution-layout-suggestions – Jonathan

+1

この質問は、この質問とは関係がないようです。間違ったリンクを貼り付けましたか? –

答えて

36

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

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), 
    } 
}; 

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

この作業の理由を示すために、ここでのViewDataは、エディタのテンプレート制御のために初期化される(MVC2プレビュー1つのソースの)TemplateHelpers.cs内の場所です上記の "expression"は、編集中のプロパティの名前で初期化されます(呼び出しスタックをさらに上に)。あなたは、あなたがHtmlHelper.IdAttributeDotReplacementHtmlPrefixプロパティにドットを交換したいと思うでしょう、デフォルト以外のHtmlHelper.IdAttributeDotReplacementを使用している(または使用することがあります)とします。

ところで、以下@Sperling、私はもともと逃したディテールを捉えました。

+3

ネストされたコレクションモデルの場合、これは有効なソリューションではありません。その場合、 '' 'HtmlFieldPrefix'''は' '' collectionModel [index]。{PropertyName} '' 'を返しますが、MVCはデフォルトで' '' 'collectionModel_ {index} __ {PropertyName}' ''という形式でIDを作成します。だから、 '' 'HtmlFieldPrefix'''の代わりに' '' '' ViewData.TemplateInfo.GetFullHtmlFieldId(string.Empty) '' 'を使うことは安全です。 – Rajeesh

4

id(モデル接頭辞付き)を生成するためにこれを使用しています。 の名前属性が必要な場合は、.Replace()部分をスキップしてください。我々の場合には

<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %> 
+0

これも動作しますが、実際にはGetFullHtmlFieldId--を見る必要はありませんそのメソッドの実装は、引数がString.Emptyの場合、単にHtmlFieldPrefixプロパティの値を返します。 –

0

我々は、かみそりで次のように使用されたExpressionHelper.GetExpressionText

Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldNameを使用していたします。http:

  // 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"/> 
関連する問題