Rendering the field name in an EditorTemplate (rendered through EditorFor())

前端 未结 3 880
离开以前
离开以前 2020-12-13 14:53

I\'m currently building the Admin back-end for a website in ASP.NET MVC.

In an ASP.NET MVC application, I\'ve started using the \'EditorFor\' helper method like so:<

相关标签:
3条回答
  • 2020-12-13 15:23

    In our case we had to use Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName with ExpressionHelper.GetExpressionText

    which in razor was used like this:

               // hiddenFor was caching the value of this html input, and the value alone, nothing else on the page!
                Expression<Func<Web.ViewModels.ApiSettingsViewModel, int>> expression = (m => m.OrgApiLoginCredentials[i].OrgApiLoginId); 
            }
            <input type="hidden" value="@Model.OrgApiLoginCredentials[i].OrgApiLoginId" name="@Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression))" class="data-org-api-login-id"/>
    
    0 讨论(0)
  • 2020-12-13 15:37

    You should be able to pull out the desired ID from the ViewData.TemplateInfo.HtmlFieldPrefix property of the view. Like this:

    <%@ Control Language="C#"
          Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
    <textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
        <%= Model.ToString() %>
    </textarea>
    

    To show why this works, here's the place in TemplateHelpers.cs (of MVC2 Preview 1 source) where ViewData is initialized for the Editor template control:

    ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) {
        Model = modelValue,
        TemplateInfo = new TemplateInfo {
            FormattedModelValue = formattedModelValue,
            ModelType = modelType,
            HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(expression),
            IsNullableValueType = (underlyingNullableType != null),
        }
    };
    

    In the call above, "expression" is initialized (further up the call stack) with the name of the property being edited.

    BTW, @Sperling below caught a detail I originally missed: if you're using (or might use) a non-default HtmlHelper.IdAttributeDotReplacement, then you'll want to replace the dots in the HtmlPrefix property with HtmlHelper.IdAttributeDotReplacement.

    0 讨论(0)
  • 2020-12-13 15:45

    Have been using this to generate id(with model prefix). Skip the .Replace() part if you want the name attribute.

    <%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>
    
    0 讨论(0)
提交回复
热议问题