【发布时间】:2010-04-18 12:51:28
【问题描述】:
我了解部分视图用于渲染视图的一部分。但我不明白return View() 和return PartialView() 之间有什么区别,你什么时候使用它们。
【问题讨论】:
标签: asp.net-mvc
我了解部分视图用于渲染视图的一部分。但我不明白return View() 和return PartialView() 之间有什么区别,你什么时候使用它们。
【问题讨论】:
标签: asp.net-mvc
返回 View() - 渲染一个 .aspx|.cshtml 页面
返回 PartialView() - 渲染 .ascx|.cshtml 控件
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;
}
}
}
【讨论】:
View() 返回一个 ViewResult 并且 PartialView() 返回一个 PartialViewResult。自己在这两种方法上运行 Reflector,看看在决定渲染什么时应该使用哪一种。 PartialViewResult 和 ViewResult 是两个不同的类,它们都继承自 ViewResultBase,它们的用途不同! PartialViews没有MasterPages(Views可以),你真的要渲染“somecontrol.ascx”使用View()...
PartialViews don't have MasterPages
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
【讨论】:
当使用 AJAX 时,控制器操作通常会返回一个 PartialView,并执行由局部视图表示的页面区域的更新。使用局部视图的常规方法是在主视图中调用Html.RenderPartial。
【讨论】: