22 votos

Representar el nombre del campo en un EditorTemplate (prestado a través de EditorFor())

Actualmente estoy edificio de la Administración de back-end de un sitio web en ASP.NET MVC.

En un ASP.NET aplicación MVC, he empezado a utilizar el 'EditorFor' método helper así:

<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, la "Biografía" de campo ha sido decorado con: [UIHelper("Html")].

Tengo una 'Html' vista parcial (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 la 'textarea' el nombre del campo, como este:

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

Pero no veo manera de hacerlo que con la configuración actual.

Todo lo que puedo pensar es en la creación de un 'Html' Perspective que contiene un 'Valor' de la propiedad y un 'ControlID' de la propiedad.

Pero si yo basado en la opinión de que, en lugar de " del Sistema.XML.Linq.XElement', no sería compatible con el 'EditorFor' método auxiliar y yo tendría que hacer todo manualmente.

Alguien ha tenido un problema similar?

34voto

Justin Grant Puntos 25644

Usted debe ser capaz de sacar el ID deseada de la ViewData.TemplateInfo.HtmlFieldPrefix propiedad de la vista. Como este:

<%@ 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, aquí está el lugar en TemplateHelpers.cs (de MVC2 de vista previa 1 fuente) donde ViewData es inicializado por el Editor de plantillas de control:

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, "la expresión" se inicializa (más arriba en la pila de llamadas) con el nombre de la propiedad que se está editando.

BTW, @Sperling a continuación cogió un detalle que había perdido: si usted está utilizando (o uso) no predeterminadas HtmlHelper.IdAttributeDotReplacement, entonces usted querrá reemplazar los puntos en la HtmlPrefix de la propiedad con HtmlHelper.IdAttributeDotReplacement.

4voto

Sperling Puntos 151

Utilizan esto para generar id (con prefijo de número de modelo). Skip la. Replace() parte si desea que el atributo name.

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X