Comment obtenir L'id HTML généré par asp.net MVC EditorFor

j'utilise les Helpers HTML pour rendre mes champs:

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

et la sortie serait quelque chose comme ceci:

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

l'assistant utilise le nom de classe + '.'è fieldName pour construire l'id.

J'ai besoin de passer l'id d'une fonction jQuery. Est-il un moyen de l'avoir sans le coder en dur? Peut-être un assistant qui peut utiliser le ASP.NET conventions MVC2?

62
demandé sur gideon 2011-01-28 17:16:41

4 réponses

ASP.NET MVC 4 A Html.IdFor () construit dans qui peut retourner ce:

@Html.IdFor(m => m.User.Surname)
136
répondu bkaid 2013-05-28 17:57:26

voir cette question: obtenir le clientid généré pour un champ de formulaire , c'est ma réponse:

j'utilise cet helper:

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)

43
répondu John Landheer 2017-08-12 08:19:48

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 nom de mon application

<%@ Import Namespace="MvcApplication2" %>

et enfin je peux utiliser mon code comme ceci:

<%=Html.HtmlIdNameFor(m=>m.Customer.Name)%>
8
répondu LeftyX 2017-05-23 10:31:37

sauf si vous créez votre propre utilisateur.Nom de famille Editoremplate que vous passez dans certains attributs HTML vous ne pourrez pas le faire avec EditorFor

cependant vous pouvez utiliser TextBoxFor et définir l'id

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

sur le thème de la récupération de cet élément avec un sélecteur jQuery vous pouvez réaliser ceci sans avoir à coder dur en utilisant certains des se termine-avec le sélecteur . L'aide que vous pourrait probablement encore utiliser EditorFor et juste le sélectionner avec $("[id^='Surname ]". Si vous essayez de sélectionner cet élément spécifique, il n'y a vraiment aucun moyen de ne pas hardcode quelque chose dans votre code jQuery.

7
répondu hunter 2011-01-28 14:23:56