64 votes

Comment obtenir l'ID HTML généré par asp.net MVC EditorFor

J'utilise les HTML Helpers pour afficher mes champs:

 <%=Html.EditorFor(m => m.User.Surname)%>
 

et la sortie serait quelque chose comme ça:

 <input class="text-box single-line" id="User_Surname" 
          name="User.Surname" type="text" value="" />
 

L'assistant utilise le className + '.' è fieldName pour construire l'identifiant.
Je dois passer l'id à une fonction jQuery. Est-il possible de l'avoir sans le coder en dur? Peut-être un assistant qui peut utiliser les conventions ASP.NET MVC2?

141voto

bkaid Points 29335

ASP.NET MVC 4 a Html.IdFor () intégré qui peut renvoyer ceci:

 @Html.IdFor(m => m.User.Surname)
 

43voto

John Landheer Points 2280

Voir cette question: obtenir le clientid généré pour un champ de formulaire , voici ma réponse:

J'utilise cette aide:

 public static partial class HtmlExtensions
{
    public static MvcHtmlString ClientIdFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> expression)
    {
        return MvcHtmlString.Create(
              htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(
                  ExpressionHelper.GetExpressionText(expression)));
    }
}
 

Utilisez-le comme n'importe quel autre assistant: @ Html.ClientIdFor (model => model.client.email)

9voto

LeftyX Points 9899

J'ai suivi les instructions de la réponse de Mac ici et j'ai construit ma propre extension personnalisée:

 public static class HtmlHelperExtensions
{
    public static string HtmlIdNameFor<TModel, TValue>(
        this HtmlHelper<TModel> htmlHelper,
        System.Linq.Expressions.Expression<Func<TModel, TValue>> expression)
    {
        return (GetHtmlIdNameFor(expression));
    }

    private static string GetHtmlIdNameFor<TModel, TValue>(Expression<Func<TModel, TValue>> expression)
    {
        if (expression.Body.NodeType == ExpressionType.Call)
        {
            var methodCallExpression = (MethodCallExpression)expression.Body;
            string name = GetHtmlIdNameFor(methodCallExpression);
            return name.Substring(expression.Parameters[0].Name.Length + 1).Replace('.', '_');

        }
        return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1).Replace('.', '_');
    }

    private static string GetHtmlIdNameFor(MethodCallExpression expression)
    {
        var methodCallExpression = expression.Object as MethodCallExpression;
        if (methodCallExpression != null)
        {
            return GetHtmlIdNameFor(methodCallExpression);
        }
        return expression.Object.ToString();
    }
}
 

J'ai importé l'espace de noms de mon application

 <%@ Import Namespace="MvcApplication2" %>
 

et enfin je peux utiliser mon code comme ceci:

 <%=Html.HtmlIdNameFor(m=>m.Customer.Name)%>
 

7voto

hunter Points 33850

à moins de créer votre propre Utilisateur.Nom de famille EditorTemplate lequel vous passez dans certains attributs HTML vous ne serez pas en mesure de le faire avec EditorFor

Cependant, vous pouvez utiliser TextBoxFor et réglez l'id

<%= Html.TextBoxFor(m => m.User.Surname, new { id = "myNewId" })%>

Sur le sujet de la récupération de cet élément avec un sélecteur jQuery, vous pouvez l'obtenir sans avoir à coder en dur en utilisant l'une des extrémités à l'aide du sélecteur. L'aide que vous pourriez probablement toujours utiliser EditorFor et il suffit de le sélectionner avec $("[id^='Surname]")`. Si vous essayez de sélectionner cet élément il n'y a vraiment aucun moyen de ne PAS coder en dur quelque CHOSE dans votre code jQuery.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X