Посмотрите вопрос о 'Взаимном исключении' в C#. И затем взгляд эти два вопросы относительно использования 'блокировки (Объектный)' оператор конкретно.
Вы должны иметь возможность вытащить желаемый идентификатор из свойства ViewData.TemplateInfo.HtmlFieldPrefix представления. Примерно так:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
<%= Model.ToString() %>
</textarea>
Чтобы показать, почему это работает, вот место в TemplateHelpers.cs (исходного кода MVC2 Preview 1), где 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
, то вы '
Использовали это для генерации идентификатора (с префиксом модели). Пропустите часть .Replace (), если вам нужен атрибут name.
<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>