- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题过去曾被问过,答案在这里 https://stackoverflow.com/a/45236544/3074765一直是我的救星。问题是当我迁移到.Net Core 3.0 时,它崩溃了。原因可以在这里找到https://github.com/aspnet/AspNetCore/issues/8678 。简而言之,微软公开了一些标记为内部的类中的函数。修复此问题删除了对 ExpressionMetadataProvider 的访问。考虑以下 HTML 帮助程序
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;
public static class MvcHtmlHelpers
{
private static IHtmlContent MetaDataFor<TModel, TValue>(this IHtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression,
Func<ModelMetadata, string> property)
{
if (html == null) throw new ArgumentNullException(nameof(html));
if (expression == null) throw new ArgumentNullException(nameof(expression));
var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, html.ViewData, html.MetadataProvider);
if (modelExplorer == null) throw new InvalidOperationException($"Failed to get model explorer for {ExpressionHelper.GetExpressionText(expression)}");
return new HtmlString(property(modelExplorer.Metadata));
}
public static IHtmlContent DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
return html.MetaDataFor(expression, m => m.Description ?? m.Name);
}
public static IHtmlContent ShortNameFor<TModel, TValue>(this IHtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression)
{
return html.MetaDataFor(expression, m =>
{
var defaultMetadata = m as
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadata;
if (defaultMetadata != null)
{
var displayAttribute = defaultMetadata.Attributes.Attributes
.OfType<DisplayAttribute>()
.FirstOrDefault();
if (displayAttribute != null)
{
return displayAttribute.ShortName ?? m.DisplayName ?? m.Name;
}
}
//Return a default value if the property doesn't have a DisplayAttribute
return m.DisplayName ?? m.Name;
});
}
}
当您按照以下步骤迁移到 .Net Core 3.0 时,无法再解析 ExpressionMetadataProvider 和 ExpressionHelper。
最佳答案
在 .Net Core 3.0 中,Microsoft 提供了一种使用依赖注入(inject)和名为 ModelExpressionProvider 的服务来获取相同元数据的方法。您可以通过 IHtmlHelper 中的 HttpContext 访问该服务。只需将 using 替换为:
using Microsoft.AspNetCore.Mvc.ViewFeatures;
这会删除 .Internal,并将 MetaDataFor 函数替换为:
private static IHtmlContent MetaDataFor<TModel, TValue>(this IHtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression,
Func<ModelMetadata, string> property)
{
if (html == null) throw new ArgumentNullException(nameof(html));
if (expression == null) throw new ArgumentNullException(nameof(expression));
ModelExpressionProvider modelExpressionProvider = (ModelExpressionProvider)html.ViewContext.HttpContext.RequestServices.GetService(typeof(IModelExpressionProvider));
var modelExplorer = modelExpressionProvider.CreateModelExpression(html.ViewData, expression);
if (modelExplorer == null) throw new InvalidOperationException($"Failed to get model explorer for {modelExpressionProvider.GetExpressionText(expression)}");
return new HtmlString(property(modelExplorer.Metadata));
}
一旦修复了 MetaDataFor 以检索它们所需的内容,其他两个扩展函数就可以正常工作。
干杯!
关于c# - 显示属性中的 ASP .Net Core 3.0 ShortName (DataAnnotations),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59000215/
ShortName 属性 返回按照早期 8.3 文件命名约定转换的短文件名。 object.ShortName object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性工作正常,但 ShortName 不工作。 [Display(Name = "Date of the transfer the task", ShortName = "Trans dat
我看到 DisplayAttribute 有一个 ShortName 属性,但我没有看到 Html.ShortName 帮助器。如何使用这个短名称作为我的表格列标题?我必须编写自己的助手吗? 最佳答案
在 ASP .NET Core 1.1 项目(VS 2017)中,我尝试使用 Display 属性的 ShortName 属性,以便使用 DisplayFor HTML Helper: [Displa
这个问题过去曾被问过,答案在这里 https://stackoverflow.com/a/45236544/3074765一直是我的救星。问题是当我迁移到.Net Core 3.0 时,它崩溃了。原因
我正在编写一个 python 脚本来将内容从另一个 CMS 导入到 Plone 4.1。由于多种原因,我像这样运行它:bin/instance run path/to/myscript 我的问题是如何
我注意到 Maya 中有一件奇怪的事情。我想知道你们是否遇到同样的问题,或者我做错了什么? 有 cmds.file 命令。文档说它有一个“shortName”标志,它应该返回当前打开的场景名称,而不带
我是一名优秀的程序员,十分优秀!