【问题标题】:Strange behaviour of HtmlHelper when partial view shares model with parent view部分视图与父视图共享模型时 HtmlHelper 的奇怪行为
【发布时间】:2014-03-30 01:10:56
【问题描述】:

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

我正在使用带有剃须刀的 ASP.NET 的 MVC,我网站上的其中一个页面是私人消息视图。这显示了来自另一个用户的私人消息,底部有一个快速回复表单,该表单位于部分视图中。我认为即使给出代码的骨架版本也会使问题变得过于混乱,甚至无法提供代码的骨架版本,因此我将仅列出关键位:

  • MessageModel - 消息的视图模型,用于查看现有消息和提交新消息
  • MessageController - 听起来像是私人消息的控制器类,包括:
    • Message - 查看您收到的消息的操作。
    • Compose - 处理新 POST 消息的操作
    • 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 视图的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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2019-01-10
    • 1970-01-01
    相关资源
    最近更新 更多