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

时间:2014-03-30 01:10:56

标签: c# asp.net asp.net-mvc razor

我确实有针对这个问题的解决方法,但是我很想知道其根本原因。

我正在使用带有剃刀的ASP.NET MVC,我网站上的其中一个页面是私人消息视图。这显示来自另一个用户的私人消息,并且底部有一个快速回复表单,该表单位于部分视图中。我认为这个问题太过于混乱,因为无关紧要的细节甚至不能提供代码的骨架版本,所以我只列出关键位:

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

MessageQuickReply视图都有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方法的参数名称应该与任何东西做什么。

任何人都可以光明吗?正如我所说,我不是在寻找变通方法或修复方法,因为我已经有了一个我很好的,我只是想了解这种行为。如果您在复制时遇到问题,请告诉我,我可以尝试提供一个简要的完整示例来演示它。

1 个答案:

答案 0 :(得分:0)

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