在重复的动态类型部分视图中从匿名类型属性发出 HTML 字符串

2024-01-04

我将匿名类型传递到动态部分视图中作为@model,其中一个属性是包含一些 HTML 的字符串。当我使用HtmlHelper方法来呈现属性,Razor 引擎正在对字符串进行编码,从而在页面上生成文字文本 -<i>text</i>在这种情况下,而不是所需的text.

由于它是动态类型视图,因此我无法直接调用该属性。具体来说,如果我尝试绑定到@Model.MyField,我得到一个RuntimeBindingException:

'object' does not contain a definition for 'MyField'

理想情况下,我可以创建一个类型(或至少一个接口)来指定视图(我建议将其作为最佳解决方案),但我的工作范围不允许这样做。另外我正在使用Partial View首先,这样我就可以回收不同类型的模板,这些类型具有相同的属性名称,但这些属性的类型不同(是的遗留代码!)。

我已经查看了几个解决类似问题的相关问题,但答案不适用于我的具体情况(由于需要将匿名类型传递给我的@model dynamic看法))。

  • 在 MVC Razor 视图中显示模型中的 HTML 字符串 https://stackoverflow.com/q/25430648

    • 列出了几种失败的方法,决定创建一个IHtmlString via @(new HtmlString(stringWithMarkup)) or MvcHtmlString.Create(stringWithMarkup)
    • 两者都需要已知类型或局部变量,并且不适用于绑定匿名属性object
  • ASP.NET MVC4 - 将包含字符串的 HTML 显示为原始 HTML https://stackoverflow.com/a/21550868

    • Accepted answer helps explains what's happening:

      Razor 中助手和其他元素的所有输出都通过 HttpUtility.HtmlEncode 进行处理,除非它们实现IHtmlString.

尝试过的解决方案

  1. 好吧,所以我想我会交换我的String其中之一的属性IHtmlString属性...不。由于我有匿名类型,Razor 引擎不知道MyField is an IHtmlString,并且(我假设)调用.ToString(),然后像往常一样进行编码。

  2. 好吧,也许@Html.DisplayFor更聪明吗?是的,但访问被拒绝:

    “System.Web.Mvc.HtmlHelper”没有名为“DisplayFor”的适用方法,但似乎有一个使用该名称的扩展方法。扩展方法无法动态分派。考虑转换动态参数或在不使用扩展方法语法的情况下调用扩展方法。

    啊对。动态分派 - 我无法在匿名方法上调用扩展方法,因为 Razor 不知道它们是什么。因为我正在使用@model dynamic以绝地风格明确地告诉它,“您不需要查看其标识“。如果我总是知道它是什么类型,那么是的,我可以在不使用语法的情况下转换对象或调用扩展方法 - 但同样,dynamic and anonymous。这里有点鸡和蛋的问题。


我找到/编译了两个解决方案,但我对这两个解决方案都不满意。嗯嗯:

  1. Set ViewBag.MyField在父级中View在渲染每个之前Partial View.

    好吧,我应该早点弄清楚这个问题,但不得不提醒这种可能性here https://stackoverflow.com/a/9402385/957950因为我很少使用它(只要可能,更喜欢强类型视图)。我实际上很早就尝试过这个,但由于我多次渲染部分的方式,它似乎不合适。我其实还是不喜欢它,因为在父视图中,我必须不断更新ViewBag.MyField每次致电之前@Html.Partial(我的用例为 6 次)。这将 C# 代码and变量重用位于我的内容中间的页面中,很容易错过并且难以维护。

  2. 使用反射:object myField = ((Type)Model.GetType()).GetProperty("MyField").GetValue(Model);

    这就是我最终决定采用的用例。即使反思不适用于这种情况 https://stackoverflow.com/a/9750979/957950,尽管它需要一些额外的错误检查。维护此功能的人员比 .NET MVC 更熟悉反射,它将代码整合到一个位置 - 位于重要的页面上,以及顶部的其余“服务器端”操作。无需重复致电或寻找推荐人。

    我实际上并不完全清楚为什么这有效(也适用于dynamic代替object),但我假设这与 Razor 引擎正在检查的有关myField对象类型直接用于已知类型的特殊渲染(IHtmlString),而不是看到一个未知的object并且需要访问编译时未知的属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在重复的动态类型部分视图中从匿名类型属性发出 HTML 字符串 的相关文章

随机推荐

  • 使用 ctree 显示每个节点的体积,在 R 中绘图

    任何人都可以告诉我如何在每个节点中添加体积 而不是最终的节点体积 t lt ctree is return a b c plot t type simple 我的树看起来像 我如何修改该图 使其在每个圆形节点上显示 N 而不仅仅是黑色或最终
  • 为什么 LEFT JOIN 与 WHERE 子句一起使用时不返回 NULL 记录? [复制]

    这个问题在这里已经有答案了 今天我尝试了一些更复杂的 MySQL 查询 我注意到 MySQL 的 LEFT JOIN 不适用于 WHERE 子句 我的意思是 它确实返回一些记录 但不会返回右侧为空的记录 例如 假设我们有表 albums a
  • 了解:从 PHP 数组到 Python?

    这是 PHP 和其他编程语言中的常见任务 我从 PHP 开发人员转过来 我想通过这个收藏来确定一下 任何精通Python的人请帮助我清楚地理解 这是我从 PHP 代码中收集的 gt Python 里有什么 gt Python 里有什么
  • Angular 2 测试 - process.env

    我尝试在应用程序中模拟请求 但流程变量存在问题 我将后端 API 的 URL 存储在 process env backend Url 中 然后在休息服务中我有 constructor private http Http this rest
  • 将 char* 复制到 char*

    这是我的代码的一部分 extern C REGISTRATION API int extreme char lKey string s1 char p NULL try ifstream myfile extreme txt int i 0
  • Android在没有edittext视图的情况下捕获硬件键盘事件

    如何在不使用 EditText 字段的情况下捕获硬件键盘事件 例如 在一个简单的活动中 在屏幕上显示一个正方形 当在滑动键盘上按下 B 时 我想将其变为蓝色 当按下 G 时 将其变为绿色 等等 我不需要颜色代码的帮助 只需要如何拦截按键 这
  • 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

    以下 verilog 源代码和 或测试平台可以很好地工作商业模拟器 iverilog https www edaplayground com x 3TuQ也形式化验证工具 yosys smtbmc https gist github com
  • ASP 服务器端代码如何损坏智能引用?

    我的公司刚刚将许多列从 varchar 转换为 nvarchar 现在看来 当我们将智能引号 即 ALT 0146 渲染到屏幕上 然后将其发送回 SQL Server 2000 数据库进行持久化时 智能引号会被损坏为 我的问题 ASP 服务
  • Paypal IPN 响应无法进入 Android 移动浏览器

    我是 Paypal 集成的新手 我正在尝试为我的 Android 应用程序实现 Paypal IPN 为了使其正常工作 我创建了一个网页 使用 PHP 并发送到 Paypal 沙箱帐户 方法 GET 以便我进行付款 我正在从中获取付款状态
  • 如何在C#中使用C++ DLL导出的接口指针

    我有一个用 C 编写的 DLL 它导出一个函数 CreateRisk 该函数返回一个接口指针 如下 extern C declspec dllexport IRisk stdcall CreateRisk return new Risk I
  • Sweet Alert 带有 href 的删除确认

    我使用 PHP 和 Sweet Alert 进行删除确认 问题是它在显示甜蜜警报之前就被删除了 这是我的 HTML 其中使用 PHP div class delete a href i class far fa trash alt i a
  • 值构造函数的别名

    是否可以为值构造函数定义别名 上下文是这样的 我正在编写一个程序 它将原始递归函数实现为图灵机 为此 我正在使用一元整数编码 我的图灵机类型定义如下 definition of a Turing machine data TuringMac
  • WSFederationAuthenticationModule v/s SessionAuthenticationModule

    根据文档 这两个模块都将用于创建 IClaimsPrincipal 的实例 我不明白为什么 WIF 费心使用 2 个 HttpModules 而不是 1 个 抱歉 我是 WIF 新人 最大的区别在于 WSFederationAuthenti
  • 禁用 JShell 历史记录

    默认情况下 JShell 启用所有键入内容的持久历史记录 可以通过按向上箭头来调用 关闭此 功能 的设置在哪里 另外 我如何清除当前历史记录 也许我比较笨 但是我不明白这个命令 reset似乎什么也没做 另外 我如何清除当前历史记录 我提出
  • 为什么用Java VisualVM监控Tomcat时堆空间不断增大?

    我有一个在 Tomcat 中运行的 JRubyOnRails 应用程序 浏览到我的应用程序 localhost 登录然后什么都不做后 堆空间似乎在不断增长 这正常吗 如果我按 执行 GC 它会再次下降 我想知道如果我将其保留到其达到计算机
  • Findbugs android gradle 插件

    我有一个安卓项目 我想介绍findbugs在我的项目中作为 gradle 插件 我尝试编辑项目的build gradle如下 buildscript repositories mavenCentral maven url https mav
  • Intent.EXTRA_EMAIL 未填充“收件人”字段

    我正在尝试使用intent questions tagged intent从我的应用程序发送电子邮件 但电子邮件的 收件人 字段不会填充 如果我添加代码来填写主题或文本 它们就可以正常工作 仅 收件人 字段不会填充 我也尝试将类型更改为 t
  • 从文件中的每一行创建一个字典

    我正在尝试从这个文件创建一个字典 键是第一个单词 值是后面的所有单词 andrew fred fred judy andrew fred george judy andrew john george 这是我的代码 follows file
  • AngularJS - 启用 HTML5 模式页面刷新而不会出现 404 错误 [重复]

    这个问题在这里已经有答案了 我也尝试通过设置 locationProvider html5Mode true 在 ui routing 和 base href 中它删除了哈希值 但在刷新时它给出了404错误 请帮帮我 正如其他人所说 启用
  • 在重复的动态类型部分视图中从匿名类型属性发出 HTML 字符串

    我将匿名类型传递到动态部分视图中作为 model 其中一个属性是包含一些 HTML 的字符串 当我使用HtmlHelper方法来呈现属性 Razor 引擎正在对字符串进行编码 从而在页面上生成文字文本 i text i 在这种情况下 而不是