我确实有针对这个问题的解决方法,但是我很想知道其根本原因。
我正在使用带有剃刀的ASP.NET MVC,我网站上的其中一个页面是私人消息视图。这显示来自另一个用户的私人消息,并且底部有一个快速回复表单,该表单位于部分视图中。我认为这个问题太过于混乱,因为无关紧要的细节甚至不能提供代码的骨架版本,所以我只列出关键位:
MessageModel
- 消息的视图模型,用于查看现有消息和提交新消息MessageController
- 听起来像是私人消息的控制器类,包括:
Message
- 查看您收到的邮件的操作。Compose
- 处理新的POSTed消息的操作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
操作方法将“RE:”添加到它传递的主题的开头,然后将其放入MessageModel
传递到其局部视图。
所以,最后我们得到了一个奇怪的部分:HtmlHelper
在部分视图中呈现的隐藏标记包含来自Message
视图{{1}的原始主题没有前置的'RE:'。
特别奇怪的是解决方法。我将MessageModel
方法中的参数名称从QuickReply
更改为subject
,并在originalSubject
视图的调用中进行了相同的更改:
Message
现在......它有效!隐藏标记包含带有“RE:”前缀的版本。
我在局部视图中插入了一个断点,并确认@{Html.RenderAction("QuickReply", new { recipient = Model.SenderUsername, originalSubject = Model.Subject })};
包含带有前缀的正确版本,无论是否应用变通方法。所以我完全不知道为什么然后用它的父模型渲染版本,或者Action方法的参数名称应该与任何东西做什么。
任何人都可以光明吗?正如我所说,我不是在寻找变通方法或修复方法,因为我已经有了一个我很好的,我只是想了解这种行为。如果您在复制时遇到问题,请告诉我,我可以尝试提供一个简要的完整示例来演示它。
答案 0 :(得分:0)
在QuickReply控制器操作中,尝试在返回ActionResult之前添加ModelState.Clear()。似乎MVC正在缓存原始模型状态。