代码之家  ›  专栏  ›  技术社区  ›  Darin Dimitrov

ASP.NET MVC和AJAX

  •  12
  • Darin Dimitrov  · 技术社区  · 16 年前

    我有一个由顶部、左侧和底部标题和一个主要内容窗格组成的视图。假设在Ajax请求期间,我需要更新顶部、底部和主面板的HTML(左标题应该保持不变)。

    我想知道实现这一目标的最佳方法是什么。第一个想法是将主要内容面板放入一个部分,并有一个控制器操作,该操作将返回partialview。这不起作用,因为当操作只返回主窗格的HTML时,我无法更新顶部和底部的标题。

    因此,如果我将顶部和底部的标题放入它们各自的局部视图中,我将需要控制器操作来返回多个局部视图。这是可能的还是我正在做一些完全偏离轨道的事情?

    我看到有可能 render a partial view to a string 所以我认为我可以在操作中使用这种技术返回一个JSON对象,该对象有3个属性表示我需要更新的3个部分的HTML。但如果可能的话,我觉得这是一个非常错误的做法。

    我的另一个想法是返回一个只包含部分所需数据的JSON对象,并使用JavaScript来构造HTML。但是在javascript中构建一个UI看起来很困难(主要内容部分使用mvcontrib GridView 进行分页和排序)。

    所以我真的很感激关于什么是处理这种情况最干净的方法的建议。另外,自适应解决方案也很好:例如,如果用户 禁用了javascript,它只会在不使用Ajax的情况下重新加载整个页面。


    更新:

    Andrew Siemer suggested 将每个部分放入自己的部分视图中,并执行多个Ajax请求。这似乎是一种完全有效的方法,但不幸的是,它不适用于我的场景,因为我在最初的问题描述中遗漏了以下细节:顶部标题实际上用于显示主面板中发生的事件的错误/信息消息。因此,例如,我需要显示错误消息,以防在获取主面板的模型时引发异常。所以只有一个请求可以更新这两个面板。

    4 回复  |  直到 13 年前
        1
  •  9
  •   Andrew Siemer    16 年前

    您可以轻松地将每个部分放置到其自己的局部视图中。这将允许您在提交/更改数据后为每个视图发出jquery请求。然后可以将每个调用推送到相应的部分。这是非常可行的,听起来像是合适的路径。

    我不希望您的控制器返回多个部分视图…因为这将打破SRP!

    更新:在下面的更新中…您仍然可以单独获取部分。这只需要稍微多一些Ajax的冷却,因为每次获取都会返回一个错误块(通过JSON请求)。如果返回任何错误,则这些错误消息可以显示在标题中。或者……一旦所有其他请求都报告了回来,您就可以使报头请求持续出现错误,在这种情况下,每个部分视图都可以将其错误消息传递给会话变量以获得错误状态……,然后在报头中显示这些消息。

    在最初的设计中,选择每个部分作为自己的部分而不是一个uber请求的一个重要原因可能还不明显。当每个部分被单独控制时,您就可以做一些奇特的事情,比如独立地缓存每个部分,在一个区域中提供比另一个区域更频繁的更新,等等。

        2
  •  0
  •   madcapnmckay    16 年前

    这是一个棘手的问题。这个怎么样?

    设置一个 partial request 对于每个顶部、左侧、主要的组件,每个组件都返回一个局部视图,其中包含该区域所需的数据。然后,每当主面板中有一个事件时,都会刷新每个区域中的部分以更新它们。

    或者让它们都在固定的计时器上轮询新数据。

        3
  •  0
  •   Michael Sagalovich    14 年前

    把你的顶视图和右视图包括在主视图的隐藏的小隔间里,然后把它们移到正确的位置上呢?

        4
  •  0
  •   Yngve B-Nilsen    13 年前

    我知道这个问题已经被回答了,但我想我只是提出一个建议:

    • 主干.js和jquery模板化可以轻松解决您的问题。

    (把这个留给阅读这个问题的人作为建议)