web-dev-qa-db-fra.com

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

J'utilise les HTML Helpers 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 à une fonction jQuery. Existe-t-il un moyen de l'avoir sans le coder en dur? Peut-être un assistant qui peut utiliser les conventions ASP.NET MVC2?

62
LeftyX

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)%>
8
LeftyX

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

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

Voir cette question: obtenir l'ID client généré pour un champ de formulaire , voici ma réponse:

J'utilise cet assistant:

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

sauf si vous créez votre propre User.Surname EditorTemplate 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 sujet de la récupération de cet élément avec un sélecteur jQuery, vous pouvez y parvenir sans avoir à coder en dur en utilisant certains des se termine par le sélecteur . En utilisant cela, vous pourriez probablement utiliser EditorFor et simplement 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 coder en dur QUELQUE CHOSE dans votre code jQuery.

7
hunter