web-dev-qa-db-ja.com

asp.net MVC Editorによって生成されたHTML IDを取得する方法

HTMLヘルパーを使用してフィールドをレンダリングします。

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

出力は次のようになります。

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

ヘルパーはclassName + '。'を使用しますèidを作成するfieldName。
IDをjQuery関数に渡す必要があります。ハードコーディングせずに使用する方法はありますか? ASP.NET MVC2の規則を使用できるヘルパーかもしれませんか?

62
LeftyX

Macの答え here の指示に従い、独自のカスタム拡張機能を作成しました。

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();
    }
}

アプリケーションの名前空間をインポートしました

<%@ Import Namespace="MvcApplication2" %>

最後に、次のようにコードを使用できます。

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

ASP.NET MVC 4には Html.IdFor() が組み込まれており、これを返すことができます。

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

この質問を参照してください: フォームフィールドの生成されたclientidを取得 、これは私の答えです:

私はこのヘルパーを使用します:

_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)));
    }
}
_

他のヘルパーと同じように使用します:@Html.ClientIdFor(model=>model.client.email)

43
John Landheer

いくつかのHTML属性を渡す独自のUser.Surname EditorTemplateを作成しない限り、EditorForでこれを行うことはできません。

ただし、TextBoxForを使用してIDを設定できます

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

JQueryセレクターを使用してこの要素を取得するトピックでは、 ends-with selector のいくつかを使用することにより、ハードコードすることなくこれを実現できます。これを使用すると、おそらくまだEditorForを使用し、$("[id^='Surname] ")`で選択することができます。この特定の要素を選択しようとしている場合、jQueryコードで何かをハードコードしない方法はありません。 。

7
hunter