当部分视图与父视图共享模型时,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 方法的参数名称应该与任何事情有什么关系。
谁能透露任何光芒?正如我所说,我不是在寻找解决方法或修复程序,因为我已经有一个很好的方法,我只是想了解这种行为。如果您在重现此问题时遇到问题,请告诉我,我可以尝试提出一个尽可能简短的完整示例来演示它。
在 QuickReply 控制器操作中,尝试在返回 ActionResult 之前添加 ModelState.Clear()。 MVC 似乎正在缓存原始模型状态。