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 即将淘汰。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...