private void EnsureViewData() {
// Get the ViewData for this ViewUserControl, optionally using the specified ViewDataKey
if (_viewData != null) {
return;
}
IViewDataContainer vdc = GetViewDataContainer(this);
if (vdc == null) {
throw new InvalidOperationException(
String.Format(
CultureInfo.CurrentUICulture,
MvcResources.ViewUserControl_RequiresViewDataProvider,
AppRelativeVirtualPath));
}
if (String.IsNullOrEmpty(ViewDataKey)) {
_viewData = vdc.ViewData;
}
else {
_viewData = DataBinder.Eval(vdc.ViewData, ViewDataKey);
}
}
private static IViewDataContainer GetViewDataContainer(Control control) {
// Walk up the control hierarchy until we find someone that implements IViewDataContainer
while (control != null) {
control = control.Parent;
IViewDataContainer vdc = control as IViewDataContainer;
if (vdc != null) {
return vdc;
}
}
return null;
}
public virtual void RenderView(ViewContext viewContext) {
// TODO: Remove this hack. Without it, the browser appears to always load cached output
viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now);
ViewUserControlContainerPage containerPage = new ViewUserControlContainerPage(this);
containerPage.RenderView(viewContext);
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate",
Justification = "There is already a ViewData property and it has a slightly different meaning.")]
protected internal virtual void SetViewData(object viewData) {
_viewData = viewData;
}
#region IViewDataContainer Members
object IViewDataContainer.ViewData {
get {
EnsureViewData();
return _viewData;
}
}
#endregion
private sealed class ViewUserControlContainerPage : ViewPage {
public ViewUserControlContainerPage(ViewUserControl userControl) {
Controls.Add(userControl);
}
}
}
}
以直接在 Controller 中 RenderView 一个用户控件(ViewUserControl),asp.net mvc 会替我们创建了一个 "空白页" (ViewUserControlContainerPage )来装载这个控件RenderView(ViewUserControl) 有个限制,就是不能有 MasterPage。
private sealed class ViewUserControlContainerPage : ViewPage {
public ViewUserControlContainerPage(ViewUserControl userControl) {
Controls.Add(userControl);
}
}
我们从 UrlRoutingModule 开始,历经 MvcRouteHandler、MvcHandler、Controller、ActionFilterAttribute,直到最后的 ViewEngine、ViewPage.完成了整个ASP.NET MVC的生命周期探索。
自由、创新、研究、探索……