【发布时间】:2014-03-30 01:10:56
【问题描述】:
我确实有解决此问题的方法,但很奇怪,我真的很想了解根本原因。
我正在使用带有剃须刀的 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 操作方法将“RE:”添加到它传递的主题的开头,然后将它放入 MessageModel 它传递给它的局部视图。
所以,最后我们到了奇怪的部分:HtmlHelper 在部分视图中呈现的隐藏标签包含来自Message 视图的MessageModel 的原始主题,没有前置'回复:'。
特别奇怪的是解决方法。我将QuickReply 方法中的参数名称从subject 更改为originalSubject,并在Message 视图的调用中进行了相同的更改:
@{Html.RenderAction("QuickReply", new { recipient = Model.SenderUsername, originalSubject = Model.Subject })};
现在……它起作用了!隐藏标签包含带有“RE:”前缀的版本。
我在局部视图中设置了一个断点,并确认 HtmlHelper.ViewData.Model 包含正确的版本,带有前缀,无论我是否应用解决方法。所以我完全不明白为什么它会转而使用其父模型渲染版本,或者 Action 方法的参数名称应该与什么有关。
谁能解释一下?正如我所说,我不是在寻找解决方法或修复,因为我已经有了一个我很好的解决方法,我只是想了解这种行为。如果您无法重现此内容,请告诉我,我可以尝试提供一个尽可能简短的完整示例来演示它。
【问题讨论】:
-
我无法复制。可以发个样品吗?
标签: c# asp.net asp.net-mvc razor