如何解决Asp.Net 5 Core DisplayFor() 发布错误
我正在将一些代码从 Asp.net 4.7 移植到 Asp.Net 5 Core。代码使用 foreach 语句循环记录。它使用传统的“displayTemplates”功能匹配 displayTemplates 文件夹中的类型,根据模型为每个项目多态显示不同的 HTML。所有类都派生自同一个基类。
为了让它在 Asp.Net 5 Core 中正常工作,我不得不更改以下代码:
@foreach (var token in Model.TokenGraph)
{
@Html.displayFor(t => token)
}
到:
@foreach (var token in Model.TokenGraph)
{
@Html.displayFor(t => token,token.GetType().Name)
}
... 传入类型的名称。
没有问题,在我的本地机器上正常工作。
问题是当我将项目发布到远程服务器时,使用的模板始终默认为基类模板。
奇怪的是,如果我将 token.GetType().Name 返回的字符串输出到页面,它匹配派生类型名称而不是基本类型名称。
这是 .Net Core 5 中的错误吗?如果没有解决方法,在 .Net 5 中是否有更好的方法来处理这个问题?
解决方法
问题最终出现在 .csproj 文件中。不知何故,从旧的遗留项目的初始转换,或之后移动文件。
简单地删除下面的这些条目即可解决问题,因为 .Net Core 通常使用这些条目来排除文件(或修改它们的编译方式),这与旧版 .Net 不同。
<ItemGroup>
<Compile Remove="Pages\Shared\DisplayTemplates\**" />
<Content Remove="Pages\Shared\DisplayTemplates\**" />
<EmbeddedResource Remove="Pages\Shared\DisplayTemplates\**" />
<None Remove="Pages\Shared\DisplayTemplates\**" />
</ItemGroup>
<ItemGroup>
<Content Include="Pages\Shared\DisplayTemplates\Token.cshtml">
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<None Include="Pages\Shared\DisplayTemplates\TextToken.cshtml" />
....
</ItemGroup>
顺便说一句,我意识到可以切换 @Html.Display() 调用并使用如下动态命名的部分。
@foreach (var token in Model.TokenGraph)
{
<partial name="@token.GetType().Name" model="token" />
}
唯一的变化是文件必须向上移动到共享目录的顶层才能被找到。这可以通过在启动文件中设置自定义位置来更好地管理,就像这样。
services.AddMvc().AddRazorOptions(options =>
{
options.PageViewLocationFormats.Add("/Pages/DisplayTemplates/{0}.cshtml");
});
这似乎更符合标准的 CORE 和 .Net 5,因为 Html Helpers 即将淘汰。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。