什么是ASP.NET Core等效于ViewData.TemplateInfo.GetFullHtmlFieldId(“ PropertyName”)?

时间:2019-06-07 06:06:19

标签: c# asp.net-mvc asp.net-core razor .net-core

我正在将Web应用程序迁移到.NET Core,并且它针对特定的输入类型使用了一些Razor编辑器模板(例如,为任何date模型属性输出DateTime输入)。

几个模板使用以下方法来获取ID属性值,以供HTML内的其他地方使用:

ViewData.TemplateInfo.GetFullHtmlFieldId("PropertyName")

但是,此方法似乎在ASP.NET Core中不再存在。

GetFullHtmlFieldName方法仍然存在,因此可以通过执行以下操作获得相同的结果(至少对于我测试过的所有结果):

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

但这对我来说似乎有点不整洁,更不用说旧方法可能会处理一些我不知道的极端情况。

半个小时的谷歌搜索,阅读.NET Core docs和搜索SO并没有发现任何有用的信息。我唯一能找到的与远程相关的是this answer(这只是确认该方法已消失)。

有人知道为什么GetFullHtmlFieldId不再存在吗?只是偶然的遗漏,还是现在有一种更新更好的方法?

2 个答案:

答案 0 :(得分:1)

不难模拟满足您需求的旧行为。一切都回到了{。{1}},它也存在于.NET Core中,但是它发生了变化,逻辑一直到它改变的路径。

TagBuilder.CreateSanitizedId类在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('.'); } 从名称中生成ID:

HtmlHelper

需要根据您的需求进行研究和调整的内容:

  1. 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); } 属性(获取或设置用于替换呈现的表单控件的id属性中的点(。)的字符)在IdAttributeDotReplacement 我看到的
  2. Microsoft.AspNetCore.Mvc.Rendering已修改为TagBuilder.CreateSanitizedId(name, idAttributeDotReplacement)

我真的不知道该方法在.NET Core中是否会成为其他东西,但我期待着发现。

答案 1 :(得分:1)

我浏览了ASP.NET Core存储库,由于对TemplateInfo.GetFullHtmlFieldId()的静态引用,因此HtmlHelper似乎是originally removed

经过大量的挖掘(.NET Core源浏览器是一个非常有用的有用的工具),我认为解决我的问题的方法是使用IHtmlHelper.GenerateIdFromName。因此,这段代码:

ViewData.TemplateInfo.GetFullHtmlFieldId("PropertyName")

现在应写为:

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

仍然没有那么整洁(或一致),但是至少通过这种方式,我们重新使用了框架用来构造其ID的the same internal logic