我正在将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
不再存在吗?只是偶然的遗漏,还是现在有一种更新更好的方法?
答案 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
需要根据您的需求进行研究和调整的内容:
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
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。