Что такое ядро ​​ASP.NET, эквивалентное ViewData.TemplateInfo.GetFullHtmlFieldId ("PropertyName")? - PullRequest
1 голос
/ 07 июня 2019

Я перевожу веб-приложение на .NET Core, и оно использует несколько шаблонов редактора Razor для определенных типов ввода (например, вывод date ввода для любых DateTime свойств модели).

Несколько шаблонов используют следующий метод для получения значения атрибута ID для использования в других местах HTML:

ViewData.TemplateInfo.GetFullHtmlFieldId("PropertyName")

Однако этот метод больше не существует в ASP.NET Core.

Метод GetFullHtmlFieldName все еще существует, поэтому можно получить тот же результат (по крайней мере, для всего, что я тестировал), выполнив:

Regex.Replace(ViewData.TemplateInfo.GetFullHtmlFieldName("PropertyName"), @"[\.\[\]]", "_")

Но это кажется немного неопрятнымдля меня, не говоря уже о том, что могут быть крайние случаи, с которыми имеет дело старый метод, о котором я не знаю.

Полчаса поиска в Google, читая документы .NET Core и поиск ТА ничего полезного не дал.Единственное, что я мог найти, что было отдаленно релевантным, это этот ответ (который только подтверждает, что метод исчез).

Кто-нибудь знает, почему GetFullHtmlFieldId больше не существует?Это просто случайное упущение или есть более новый и лучший способ получить это сейчас?

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Я просмотрел репозиторий ASP.NET Core, и похоже, что TemplateInfo.GetFullHtmlFieldId() был изначально удален из-за статической ссылки на HtmlHelper.

После долгих размышлений (исходный браузер .NET Core является удивительно полезным инструментом), я думаю, что решение моей проблемы - использовать IHtmlHelper.GenerateIdFromName. Итак, этот код:

ViewData.TemplateInfo.GetFullHtmlFieldId("PropertyName")

теперь должно быть записано как:

Html.GenerateIdFromName(ViewData.TemplateInfo.GetFullHtmlFieldName("PropertyName"))

Все еще не все так аккуратно (или непротиворечиво), но, по крайней мере, таким образом, мы повторно используем ту же внутреннюю логику , которую каркас использует для построения своих идентификаторов.

1 голос
/ 07 июня 2019

Не должно быть сложно смоделировать старое поведение для ваших нужд.Все возвращается к TagBuilder.CreateSanitizedId, который существует и в .NET Core, но он изменился, и логика изменилась по пути, по которому он изменился.

TemplateInfo класс имел следующее в System.Web.Mvc:

private string _htmlFieldPrefix;

public string HtmlFieldPrefix
{
    get { return _htmlFieldPrefix ?? String.Empty; }
    set { _htmlFieldPrefix = value; }
}

public string GetFullHtmlFieldId(string partialFieldName)
{
    return HtmlHelper.GenerateIdFromName(GetFullHtmlFieldName(partialFieldName));
}

public string GetFullHtmlFieldName(string partialFieldName)
{
    // This uses "combine and trim" because either or both of these values might be empty
    return (HtmlFieldPrefix + "." + (partialFieldName ?? String.Empty)).Trim('.');
}

Затем он использует HtmlHelper для создания идентификатора из имени:

public static string IdAttributeDotReplacement
{
   get { return WebPages.Html.HtmlHelper.IdAttributeDotReplacement; }
   set { WebPages.Html.HtmlHelper.IdAttributeDotReplacement = value; }
}

public static string GenerateIdFromName(string name, string idAttributeDotReplacement)
{
    if (name == null)
    {
        throw new ArgumentNullException("name");
    }

    if (idAttributeDotReplacement == null)
    {
        throw new ArgumentNullException("idAttributeDotReplacement");
    }

    // TagBuilder.CreateSanitizedId returns null for empty strings, return String.Empty instead to avoid breaking change
    if (name.Length == 0)
    {
        return String.Empty;
    }

    return TagBuilder.CreateSanitizedId(name, idAttributeDotReplacement);
}

Что необходимо исследовать и настроить в соответствии с вашими потребностями:

  1. IdAttributeDotReplacement свойство (получает или задает символ, используемый для замены точки (.) В атрибуте id визуализированных элементов управления формы), которое также существует в .NET Core в Microsoft.AspNetCore.Mvc.Rendering
  2. TagBuilder.CreateSanitizedId(name, idAttributeDotReplacement), который яможно видеть, что он был изменен на TagBuilder.CreateSanitizedId(string name, string invalidCharReplacement);

Я действительно не знаю, как этот метод станет чем-то другим в .NET Core, но я с нетерпением жду, чтобы узнать.

...