using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Mvc.ModelBinding; using Microsoft.AspNet.Mvc.Rendering; namespace Microsoft.AspNet.Mvc.Razor { public abstract class RazorView : RazorView { public TModel Model { get { return ViewData == null ? default(TModel) : ViewData.Model; } } public ViewDataDictionary ViewData { get; private set; } public IHtmlHelper Html { get; set; } public override Task RenderAsync([NotNull] ViewContext context) { ViewData = context.ViewData as ViewDataDictionary; if (ViewData == null) { if (context.ViewData != null) { ViewData = new ViewDataDictionary(context.ViewData); } else { var metadataProvider = context.ServiceProvider.GetService(); ViewData = new ViewDataDictionary(metadataProvider); } // Have new ViewDataDictionary; make sure it's visible everywhere. context.ViewData = ViewData; } InitHelpers(context); return base.RenderAsync(context); } private void InitHelpers(ViewContext context) { Html = context.ServiceProvider.GetService>(); var contextable = Html as ICanHasViewContext; if (contextable != null) { contextable.Contextualize(context); } } } }