微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Asp.Net 5 Core DisplayFor() 发布错误

如何解决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 举报,一经查实,本站将立刻删除。