【问题标题】:What's the difference between "return View()" and "return PartialView()"“return View()”和“return PartialView()”有什么区别
【发布时间】:2010-04-18 12:51:28
【问题描述】:

我了解部分视图用于渲染视图的一部分。但我不明白return View() 和return PartialView() 之间有什么区别,你什么时候使用它们。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    返回 View() - 渲染一个 .aspx|.cshtml 页面

    • 呈现一个普通的 .aspx 页面,该页面也可以包含部分视图

    返回 PartialView() - 渲染 .ascx|.cshtml 控件

    • 将一段 HTML 呈现给浏览器,可以通过 AJAX 或非 AJAX 请求等方式进行请求。

    View() 返回ViewResult PartialView() 返回PartialViewResult 都继承自ViewResultBase

    下面的Reflector描述了区别...

    public class PartialViewResult : ViewResultBase
    {
       // Methods
       protected override ViewEngineResult FindView(ControllerContext context)
       {
          ViewEngineResult result = base.ViewEngineCollection.FindPartialView(context, base.ViewName);
          if (result.View != null)
          {
             return result;
          }
          StringBuilder builder = new StringBuilder();
          foreach (string str in result.SearchedLocations)
          {
             builder.AppendLine();
             builder.Append(str);
          }
          throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.Common_PartialViewNotFound, new object[] { base.ViewName, builder }));
       }
    }
    
    
    public class ViewResult : ViewResultBase
    {
       // Fields
       private string _masterName;
    
       // Methods
       protected override ViewEngineResult FindView(ControllerContext context)
       {
          ViewEngineResult result = base.ViewEngineCollection.FindView(context, base.ViewName, this.MasterName);
          if (result.View != null)
          {
             return result;
          }
          StringBuilder builder = new StringBuilder();
          foreach (string str in result.SearchedLocations)
          {
             builder.AppendLine();
             builder.Append(str);
          }
          throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, MvcResources.Common_ViewNotFound, new object[] { base.ViewName, builder }));
       }
    
       // Properties
       public string MasterName
       {
          get
          {
             return (this._masterName ?? string.Empty);
          }
          set
          {
             this._masterName = value;
          }
       }
    }
    

    【讨论】:

    • 如果可以的话,我会投反对票,但是 ReturnView() 与 View() 与渲染“.aspx”还是“.ascx”视图完全无关。更正 - 它似乎确实可以处理使用约定获取的视图(即:控制器呈现相同名称的视图)。无论如何,您可以毫无问题地将 .aspx 和 .ascx 视图提供给 PartialView()。
    • View() 返回一个 ViewResult 并且 PartialView() 返回一个 PartialViewResult。自己在这两种方法上运行 Reflector,看看在决定渲染什么时应该使用哪一种。 PartialViewResult 和 ViewResult 是两个不同的类,它们都继承自 ViewResultBase,它们的用途不同! PartialViews没有MasterPages(Views可以),你真的要渲染“somecontrol.ascx”使用View()...
    • @xandercoded 所有这些答案和 cmets 都可以替换为您的 PartialViews don't have MasterPages
    • 如果有人能用简单的话解释反射器代码差异会很棒
    【解决方案2】:

    return PartialView() 返回 HTML 代码片段,它与 ViewUserControls - ASCX 文件一起使用。使用“return PartialView()”的主要优点是当您不想呈现所有其他 HTML 页面内容时,例如 HTML、BODY、HEAD 标记。

    我最常见的用途之一是当我想根据对操作的请求是否为 AJAX 调用来仅呈现用户控件时。

    所以我有一个名为 MyControl.aspx 的视图,我在其中使用 RenderPartial HTML 帮助程序,我有一个名为 MyControl.ascx 的局部视图,我在其中进行实际渲染。

    我可以像这样在我的控制器操作中在这两者之间切换:

    if (Request.IsAjaxRequest())
        return PartialView("MyControl"); // this renders MyControl.ascx
    
    return View(); // this render MyControl.aspx
    

    【讨论】:

      【解决方案3】:

      当使用 AJAX 时,控制器操作通常会返回一个 PartialView,并执行由局部视图表示的页面区域的更新。使用局部视图的常规方法是在主视图中调用Html.RenderPartial。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 2011-08-26
        • 2015-11-04
        • 2016-10-01
        • 1970-01-01
        • 2013-08-25
        • 1970-01-01
        相关资源
        最近更新 更多