【问题标题】:ASP.NET MVC ViewResult vs PartialViewResultASP.NET MVC ViewResult 与 PartialViewResult
【发布时间】:2009-01-23 13:57:59
【问题描述】:

名为ViewResultPartialViewResult 的控制器结果有什么区别?更重要的是,PartialViewResult 什么时候使用?

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    PartialViewResult 用于呈现局部视图(fx。只是一个用户控件)。这对于 AJAX 的东西来说非常漂亮,即

    <script type="text/javascript">
        $.get(
            "/MyController/MyAction",
            null,
            function (data) { $("#target").html(data) }
         );
    </script>
    

    和行动

    public ActionResult MyAction() 
    {
        return PartialView("SomeView");
    }
    

    其中 SomeView 是 MVC 用户控件,例如:

    <div>
       <%= DateTime.Now.ToString() %>
    </div>
    

    【讨论】:

    • 但是为什么需要它呢?您可以轻松地返回带有常规 View("SomeView") 的用户控件吗?
    • 我想说:主要是语义。如果您检查 Codeplex 源代码,您将它们都继承自 ViewResultBase,主要区别在于 ViewResult 支持指定母版页,PartialViewResult 不支持
    • 重点是关于母版页的。使用 PartialViewResult 时,您通常只想返回一小块标记,而不是带有 DOCTYPE、 标记、脚本引用等的整个页面。它在 Ajax 场景中非常有用。
    • 当您有一个不想耦合到任何给定页面的用户控件时,它会很方便。在我当前的问题中,我在主控中有一个用户控件。我不希望每个页面都获取它的数据源,所以我需要控制去获取它的数据。我怀疑这个动作是为了什么..
    【解决方案2】:

    http://msmvps.com/blogs/luisabreu/archive/2008/09/16/the-mvc-platform-action-result-views.aspx

    在实践中,您将使用 PartialViewResult 用于输出 视图的一小部分。这就是为什么你 没有母版页选项 与他们打交道时。在另一 手,您将使用 ViewResult 获得“完整”视图。正如你 可能期望,Controller 类 公开了几种方法,可以让 你减少了打字量 需要即时这些类型的 行动结果。

    一般来说,ViewResult 用于渲染带有可选 master 的页面,PartialViewResult 用于用户控件(可能响应 AJAX 请求)。

    【讨论】:

      【解决方案3】:

      现有答案都没有真正回答“有什么区别”这个问题。

      区别如下:

      1) 视图引擎将尝试查找视图的位置:

      • 对于 ViewResult,它位于 ViewLocationFormats 和 MasterLocationFormats 中
      • 对于 PartialViewResult,它位于 PartialViewLocationFormats 中

      2) ViewResult 具有附加属性 MasterName

      仅此而已。

      【讨论】:

      • 有趣的是,你在 5 年后回答了这个问题,而我在 2 年后又加了一张赞成票。
      【解决方案4】:

      在某些情况下,您希望将视图分解为几个小组件。我现在正在使用的一个用例是,我有一个多语言网站,我想使用 AJAX 原则重新加载内容。

      对于非多语言网站,我通常会创建另一个 ActionResult 以返回随新参数而变化的 ViewModel。我喜欢使用我称之为 JsonpResult 的自定义 ActionResult。问题在于我的标签不在我的数据库中,而是在资源文件中。所以我需要做的是以某种方式将我的资源文件数据合并到 ViewModel 中。

      一旦数据通过管道传输,我的 AJAX 回调会使用 Javascript(我使用 jQuery)将 ViewModel 响应连接回 HTML 页面。

      这绝对有效,但它成为可维护性的问题。我现在不仅需要维护我原来的 ASP.NET 视图,还需要维护一组处理 AJAXian 行为的脚本。如果您需要对您的网站进行 SEO,那么您确实需要确保服务器端和客户端的行为都相同。

      这就是局部视图对我起作用的地方。我所做的是“拉出”发生大量重新加载的逻辑数据部分。 PartialView 的好处是您可以将 ViewData 和 Model 传递给 PartialView。如果您的 PartialView 是针对您的 ViewModel 进行强类型化的,您可以获得 Intellisense 来帮助连接 PartialView。

      现在我对 AJAX 调用所需要做的就是将响应写回单个 DIV,而不是单独处理数据点。这确实意味着会有更多的内容流下来。但是,这种权衡更容易阅读和维护代码。

      【讨论】:

        【解决方案5】:

        主要区别之一是 PartialViewResult 不使用 _ViewStart.cshtml。 _ViewStart.cshtml 文件中的代码在视图中的任何代码之前在渲染开始时执行。

        【讨论】:

          猜你喜欢
          • 2011-04-13
          • 2012-01-24
          • 2010-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-18
          • 1970-01-01
          • 2013-11-29
          相关资源
          最近更新 更多