我有一个用JavaScript编写的单页面应用程序,我使用HTML5历史API来处理客户端的URL。这意味着发送到服务器的任何URL都应该使服务器呈现相同的页面。
在ASP.NET MVC 5中,我编写了这段代码来执行此操作:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
// ...
routes.Add(new Route("{*path}", new MyRouteHandler()));
}
}
public class MyRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return WebPageHttpHandler.CreateFromVirtualPath("~/index.cshtml");
}
}
这非常有效。无论服务器获取什么URL,它都会呈现index.cshtml。请注意,我可以使用.cshtml文件(而不是.html文件),这意味着我可以使用一些C#代码来动态更改包含的.js脚本,将版本号附加到.css文件,等等。更重要的是,我没有必要实现控制器和视图等等,只是为了呈现这个.cshtml文件。
现在我们来问一个问题:你如何在ASP.NET Core中做到这一点?我一直在阅读文档,但我没有看到如何在不添加控制器类,查看文件夹和其他装备的情况下呈现.cshtml文件。
任何人都知道ASP.NET Core中的等效代码吗?
答案 0 :(得分:1)
目前正在运行CSHTML页面"正常方式"在ASP.NET Core中需要使用ASP.NET Core MVC。
但是,正在进行的计划功能与ASP.NET(非核心)Web页面有些类似,您可以在其中使用独立的CSHTML文件。正在跟踪此功能:https://github.com/aspnet/Mvc/issues/494(并且就新功能的命名而言,此处正在跟踪:https://github.com/aspnet/Mvc/issues/5208)。
还有一个如何将MVC视图呈现为字符串的示例(例如,生成电子邮件,报告等),此示例可在此处获取:https://github.com/aspnet/Entropy/tree/dev/samples/Mvc.RenderViewToString 但是要在您描述的场景中使用此示例,您必须做一些额外的管道来将其连接为自己的中间件(不是很多的管道;只是一点点!)。
还值得注意的是,在您的方案中,您可能不希望所有网址都转到此视图,因为您仍然需要先运行静态文件中间件来处理CSS,JS,图像和其他静态内容。大概你只是希望所有其他 URL都转到这个动态视图。