Domanda

Al momento sto costruendo l'amministrazione di back-end per un sito web in ASP.NET MVC.

In un'applicazione ASP.NET MVC, ho iniziato ad usare il metodo di supporto 'EditorFor' in questo modo:

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

Nel modello, il campo 'Biografia' è stato decorato con:. [UIHelper ( "HTML")]

Ho una vista parziale 'Html' (in Viste / Shared / EditorTemplates):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>

<textarea class="html">
    <%= Model.ToString() %>
</textarea>

Ora mi piacerebbe avere l'attributo 'ID' della 'textarea' impostato sul nome del campo, in questo modo:

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

Ma non riesco a vedere un modo per farlo con il set corrente fino.

Tutto quello che viene in mente è la creazione di un ViewModel 'html' che contiene proprietà un 'valore' e una proprietà 'ControlID'.

Ma se ho basato la vista fuori che, piuttosto che 'System.XML.Linq.XElement', non sarebbe più compatibile con il metodo di supporto 'EditorFor' e avrei dovuto fare tutto manualmente.

Qualcuno ha avuto un problema simile ancora?

È stato utile?

Soluzione

Si dovrebbe essere in grado di tirare fuori il ID desiderato dalla proprietà ViewData.TemplateInfo.HtmlFieldPrefix della vista. In questo modo:

<%@ Control Language="C#"
      Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
    <%= Model.ToString() %>
</textarea>

Per mostrare il motivo per cui questo funziona, ecco il posto in TemplateHelpers.cs (di MVC2 Preview 1 fonte) dove Viewdata viene inizializzato per il controllo template 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),
    }
};

Nella chiamata sopra, "espressione" viene inizializzato (ulteriormente lo stack di chiamate) con il nome della proprietà di essere modificato.

A proposito, @Sperling sotto preso un dettaglio che in origine mancava:. Se si sta utilizzando (o potrebbe utilizzare) un HtmlHelper.IdAttributeDotReplacement non predefinito, quindi ti consigliamo di sostituire ai puntini nella proprietà HtmlPrefix con HtmlHelper.IdAttributeDotReplacement

Altri suggerimenti

Sono state usando questo per generare id (con il prefisso modello). Saltare la parte .Rimontare () se si desidera che il nome attributo.

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

Nel nostro caso abbiamo dovuto usare Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName con ExpressionHelper.GetExpressionText

che a rasoio è stato utilizzato in questo modo:

           // 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"/>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top