Renderizar el nombre del campo en una edición de EDITORTEMPLATE (Renderizado a través de Editorfor ())

StackOverflow https://stackoverflow.com/questions/1482925

Pregunta

Actualmente estoy construyendo el back-end administrador para un sitio web en ASP.NET MVC.

En una aplicación ASP.NET MVC, comencé a usar el método de ayuda 'Editor' como 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, el campo 'biografía' ha sido decorado con: [uihelper ("html")].

Tengo una vista parcial 'html' (en vistas/compartir/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' del 'TextAREA' establecido en el nombre del campo, como este:

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

Pero no puedo ver una manera de hacer eso con la configuración actual.

Todo lo que se me ocurre es crear un Modelo de vista 'HTML' que contenga una propiedad de 'valor' y una propiedad 'ControlID'.

Pero si basé la vista de eso, en lugar de 'system.xml.linq.xelement', ya no sería compatible con el método de 'editor para' y tendría que hacer todo manualmente.

¿Alguien ha tenido un problema similar todavía?

¿Fue útil?

Solución

Debería poder extraer la ID deseada de la propiedad ViewData.templateInfo.htmlfieldprefix de la vista. Como 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é esto funciona, aquí está el lugar en TemplateHelpers.cs (de MVC2 Preview 1 Source) donde ViewData se inicializa para el control de la 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 la "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 atrapé un detalle que originalmente me perdí: si está usando (o podría usar) un no deformento HtmlHelper.IdAttributeDotReplacement, entonces querrás reemplazar los puntos en el HtmlPrefix propiedad con HtmlHelper.IdAttributeDotReplacement.

Otros consejos

Han estado utilizando esto para generar ID (con prefijo del modelo). Omita la parte .replace () si desea el atributo de nombre.

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

En nuestro caso tuvimos que usar Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName con ExpressionHelper.GetExpressionText

que en Razor 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"/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top