2010-11-23 2 views
1

J'ai quelques couches de contrôles utilisateur imbrication personnalisée:Comment EditorFor Set ID et le nom des attributs HTML sur des éléments de formulaire

RegisterUser.aspx

<%@ .... Inherit="System.Web.Mvc.ViewPage<RegisterUserViewModel>" 
... 
<%= Html.EditorFor(m => m.Details) %> 
... 

UserDetails.ascx

<%@ .... Inherit="System.Web.Mvc.ViewUserControl<UserDetails>" 
... 
<%= Html.EditorFor(m => m.BirthDate) %> <!--BirthDate is of type DateTime--> 
... 

et je ont déclaré DateTime.ascx dans Shared/EditorTemplates

<%@ .... Inherit="System.Web.Mvc.ViewUserControl<dynamic>" 
... 
<input type="text" id="???" /> 
... 

La question est de savoir comment définir l'attribut id d'entrée? Je sais que EditorFor fait de la magie pour les types par défaut. Par exemple, si DateTime était de type string, EditorFor définira l'ID du type d'entrée sur "Details_BirthDate" et l'attribut name sur "Details.BirthDate". Je veux savoir comment c'est fait? Parce que je veux l'utiliser pour mes types personnalisés spéciaux.

Répondre

1

a trouvé la solution en utilisant les deux méthodes suivantes:

<%= Html.ViewData.TemplateInfo.GetFullHtmlFieldId("BirthDate") %> 

<%= Html.ViewData.TemplateInfo.GetFullHtmlFieldName("BirthDate") %> 
1

Combien de niveaux de modèles d'éditeur allez-vous utiliser? Je pense vraiment que le dernier est redondant et vous pouvez utiliser:

<%= Html.TextBoxFor(m => m.BirthDate) %> 

Par ailleurs, il y a MVCContrib ce qui est génial. Il a des choses comme:

<%: Html.IdFor(x => x.BirthDate) %> 

et:

<%: Html.NameFor(x => x.BirthDate) %> 

qui est vraiment utile dans certains scénarios.


MISE À JOUR:

Toujours utiliser des modèles de l'éditeur fortement typé:

<%@ .... Inherit="System.Web.Mvc.ViewUserControl<DateTime>" 
<%: Html.TextBoxFor(x => x) %> 
+0

la dernière couche - Html.TextBoxFor (m => m.BirthDate) - n'est pas redondant parce que je veux le rendre pleinement sur mesure, comme datepicker et etc. Je Vraiment vouloir utiliser un contrôle personnalisé pour la dernière couche – devfreak

+0

Voir ma mise à jour sur l'utilisation d'un modèle d'éditeur fortement typé pour DateTime. –

0

Je pense que vous cherchez ViewData.TemplateInfo.HtmlFieldPrefix. Exemple:

<input type="text" id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>"> 

Vous pouvez utiliser GetFullHtmlFieldId si vous avez besoin de spécifier un champ, mais si elle est utilisée dans un affichage ou éditeur de modèle que vous pouvez simplement utiliser HtmlFieldPrefix.

Plus d'informations dans cette question SO: Rendering the field name in an EditorTemplate (rendered through EditorFor())

Questions connexes