当部分视图与父视图共享模型时,HtmlHelper 的奇怪行为

本文关键字:视图 HtmlHelper 共享 模型 当部 | 更新日期: 2023-09-27 17:55:26

我确实有解决此问题的方法,但这太奇怪了,我真的很想了解根本原因。

我正在使用ASP。NET的MVC与剃刀,我网站上的一个页面是私人消息视图。这显示了来自其他用户的私人消息,并在底部有一个快速回复表单,该表单位于部分视图中。我认为这会用不相关的细节使问题变得混乱太多,甚至无法给出代码的骨架版本,所以我只列出关键位:

  • MessageModel - 消息的视图模型,用于查看现有消息和提交新消息
  • MessageController - 听起来,私人消息内容的控制器类,包括:
    • Message - 用于查看收到的消息的操作。
    • Compose - 处理新的 POST 邮件的操作
    • QuickReply - 部分_QuickReply视图的操作。
  • Message视图和_QuickReply部分视图。

Message视图和QuickReply视图都有一个MessageModel作为其视图模型,Compose将一个视图作为参数。

因此,Message视图包含以下行,用于将_QuickReply呈现为部分:

@{Html.RenderAction("QuickReply", new { recipient = Model.SenderUsername, subject = Model.Subject })};   

_QuickReply包含(以及其他内容)以下内容:

@Html.HiddenFor(m => m.Subject)

最后,QuickReply操作方法在传递到其部分视图MessageModel之前,将"RE:"附加到它传递的主题的开头

所以,最后我们到了奇怪的部分:HtmlHelper在部分视图中呈现的隐藏标签包含Message视图MessageModel中的原始主题,没有前面的"RE:"。

让它特别奇怪的是解决方法。我将 QuickReply 方法中的参数名称从 subject 更改为 originalSubject,并从Message视图中对调用进行了相同的更改:

@{Html.RenderAction("QuickReply", new { recipient = Model.SenderUsername, originalSubject = Model.Subject })};  

现在。。。它有效!隐藏标记包含带有"RE:"前缀的版本。

我在分部视图中保留了一个断点,并确认HtmlHelper.ViewData.Model包含正确的版本,带有前缀,无论我是否应用解决方法。所以我完全困惑为什么它会使用其父模型来呈现版本,或者 Action 方法的参数名称应该与任何事情有什么关系。

谁能透露任何光芒?正如我所说,我不是在寻找解决方法或修复程序,因为我已经有一个很好的方法,我只是想了解这种行为。如果您在重现此问题时遇到问题,请告诉我,我可以尝试提出一个尽可能简短的完整示例来演示它。

当部分视图与父视图共享模型时,HtmlHelper 的奇怪行为

在 QuickReply 控制器操作中,尝试在返回 ActionResult 之前添加 ModelState.Clear()。 MVC 似乎正在缓存原始模型状态。