我的教科书展示了如何编写自定义视图引擎的示例(实现IViewEngine,它使用的视图是实现IView的类
public interface IViewEngine{
ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage);
ViewEngineResult GetView(string executingFilePath, string viewPath, bool isMainPage);
}和
public interface IView {
string Path { get; }
Task RenderAsync(ViewContext context);
}下面是实现IView的自定义视图
public class DebugDataView : IView
{
public string Path => String.Empty;
public async Task RenderAsync(ViewContext context)
{
context.HttpContext.Response.ContentType = "text/plain";
StringBuilder sb = new StringBuilder();
sb.AppendLine("---Routing Data---");
foreach (var kvp in context.RouteData.Values)
{
sb.AppendLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}
sb.AppendLine("---View Data---");
foreach (var kvp in context.ViewData)
{
sb.AppendLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}
sb.AppendLine(context.ViewData.Model.ToString());
await context.Writer.WriteAsync(sb.ToString());
}
}我有几个问题
Q1-是否意味着在.cshtml视图文件中的内容被razor解析后,razor将在幕后创建一个实现IView的视图对象,以便在RenderAsync中实现真正的内容?
Q2- FindView或GetView方法返回一个ViewEngineResult对象,那么谁将把ViewEngineResult对象转换为响应(客户端的html)、MVC或Razor引擎?
发布于 2019-08-06 21:37:35
不是你想的那样。从技术上讲,有一个底层的View<TModel> (它实现了IView),但这实际上是来自动作的东西。当你返回像View(model)这样的东西时,它返回的是一个ViewResult,在里面,它正在构建这个支持类。
实际的cshtml文件实际上只是一个文本文件。有一个对它的文件系统引用(即来自IView接口的Path ),但仅此而已。它本身并不是“编译”的。视图引擎将其路径提供给View<TModel>实例,然后加载该文件的内容并开始解析( Razor ),View<TModel>为该解析过程提供数据支持,即当它遇到Razor代码时,信息将从View<TModel>实例中拉出。
一旦视图被“渲染”。结果基本上只是一个字符串,然后将其转储到响应中。(从技术上讲,这是异步的,因此响应可以并且通常是逐步构建的,而不是在结束时创建的。然而,这并不真正与讨论密切相关。)
https://stackoverflow.com/questions/57377019
复制相似问题