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 auxiliar como:

<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’ set para el nombre del campo, por ejemplo:

<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 he 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 pero?

InformationsquelleAutor Jonathan | 2009-09-27

3 Comentarios

  1. 37

    Usted debería 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 el HtmlPrefix propiedad con HtmlHelper.IdAttributeDotReplacement.

    • Esto no es una solución válida en el caso de anidado modelo de la colección. En ese caso HtmlFieldPrefix devuelve collectionModel[index].{PropertyName} pero por defecto MVC crea id en un formato collectionModel_{index}__{PropertyName}. Así que es seguro para el uso ViewData.TemplateInfo.GetFullHtmlFieldId(string.Empty) en lugar de HtmlFieldPrefix
  2. 4

    Han estado utilizando esto para generar el id(con el modelo prefijo). Saltar la .Replace (), si
    usted desea que el nombre del atributo.

    <%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>
    • esto funciona muy, pero que en realidad no necesita GetFullHtmlFieldId– si se observa la implementación del método, si su argumento es una Cadena.Vacío, simplemente devuelve el valor de la HtmlFieldPrefix de la propiedad.
  3. 0

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

    que en razor fue utilizado como esta:

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

Dejar respuesta

Please enter your comment!
Please enter your name here