2009-09-27 9 views
22

Actualmente estoy construyendo el back-end Admin para un sitio web en ASP.NET MVC.Renderizando el nombre del campo en una Plantilla del Editor (presentada a través de EditorFor())

En una aplicación ASP.NET MVC, He empezado a utilizar el método de ayuda 'EditorFor', 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' se ha decorado con: [UIHelper ("Html")].

que tienen una vista parcial 'html' (en Vistas/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' del 'área de texto' establecido en el nombre de el campo, así:

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

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

Todo lo que puedo pensar es crear un 'ViewModel' 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 todavía?

+0

acaba de encontrar una pregunta similar ser preguntado por @ Nathan-Taylor: http: //stackoverflow.com/questions/1329148/asp-net-mvc-solution-layout-suggestions – Jonathan

+1

Esa pregunta no parece tener nada que ver con esta. ¿Pegaste el enlace equivocado? –

Respuesta

36

Debería poder extraer el ID deseado de la propiedad ViewData.TemplateInfo.HtmlFieldPrefix de la vista. De esta manera:

<%@ 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 1 Previsualización de origen), donde ViewData se inicializa para el control de plantilla 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 arriba, 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 continuación cogió un detalle que me perdí un principio: si está utilizando (o puede ser que utilice) un no por defecto HtmlHelper.IdAttributeDotReplacement, entonces usted querrá reemplazar los puntos en la propiedad HtmlPrefix con HtmlHelper.IdAttributeDotReplacement.

+3

Esta no es una solución válida en el caso del modelo de colección anidado. En ese caso, '' 'HtmlFieldPrefix''' devuelve' '' collectionModel [index]. {PropertyName} '' ', pero de forma predeterminada MVC crea el ID en un formato' '' collectionModel_ {index} __ {PropertyName} '' '.Por lo tanto, es seguro usar '' 'ViewData.TemplateInfo.GetFullHtmlFieldId (string.Empty)' '' en lugar de '' 'HtmlFieldPrefix'' – Rajeesh

4

Lo he usado 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) %> 
+0

esto también funciona, pero en realidad no necesita GetFullHtmlFieldId-- si nos fijamos en la implementación de ese método, si su argumento es String.Empty, simplemente devuelve el valor de la propiedad HtmlFieldPrefix. –

0

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

que a su navaja de afeitar se utilizó la siguiente manera:

  // 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"/> 
Cuestiones relacionadas