asp.net mvc - password - Representación del nombre de campo en una Plantilla de Editor(presentada a través de EditorFor())
select asp-for asp-items (3)
Actualmente estoy creando el back-end de administración para un sitio web en ASP.NET MVC.
En una aplicación ASP.NET MVC, comencé a utilizar el método de ayuda ''EditorFor'' de la siguiente manera:
<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>
En el modelo, el campo ''Biografía'' ha sido decorado con: [UIHelper ("Html")].
Tengo una vista parcial ''Html'' (en Views / Shared / EditorTemplates):
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea class="html">
<%= Model.ToString() %>
</textarea>
Ahora me gustaría tener el atributo ''ID'' de ''textarea'' establecido en el nombre del campo, como este:
<textarea id="Biography" class="html">
...
</textarea>
Pero no veo una manera de hacerlo con la configuración actual.
Todo lo que puedo pensar es en crear un modelo de vista ''Html'' que contenga una propiedad ''Value'' y una propiedad ''ControlID''.
Pero si baso la vista en lugar de ''System.XML.Linq.XElement'', ya no sería compatible con el método de ayuda ''EditorFor'' y tendría que hacer todo manualmente.
Alguien ha tenido un problema similar?
En nuestro caso, tuvimos que usar Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName
con ExpressionHelper.GetExpressionText
que en la maquinilla de afeitar se usó así:
// 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"/>
He estado usando esto para generar ID (con el prefijo del modelo). Omita la parte .Replace () si desea el atributo de nombre.
<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>
Debería poder extraer el ID deseado de la propiedad ViewData.TemplateInfo.HtmlFieldPrefix de la vista. Me gusta esto:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
<%= Model.ToString() %>
</textarea>
Para mostrar por qué funciona esto, este es el lugar en TemplateHelpers.cs (de la fuente MVC2 Preview 1) donde ViewData se inicializa para el control de plantilla del Editor:
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),
}
};
En la llamada anterior, se inicializa "expresión" (más arriba en la pila de llamadas) con el nombre de la propiedad que se está editando.
Por cierto, @Sperling a continuación captó un detalle que olvidé originalmente: si está usando (o podría usar) un HtmlHelper.IdAttributeDotReplacement
no predeterminado, entonces querrá reemplazar los puntos en la propiedad HtmlHelper.IdAttributeDotReplacement
con HtmlHelper.IdAttributeDotReplacement
.