ASP.NET网页VNEXT或Razor页面

既然ASP.NET核心的RTM已发货,ASP.NET团队正在查看留下的功能,包括SignalR和网页。 ASP.NET核心路线图始终拥有这些项目,该项目在RTM之后的第一个主要版本中被列入,这将是ASP.NET核心1.1。最近,ASP.NET团队在驾驶下一个版本的网页上的目标上提供了一个关于Gitals的更新,它提供了有趣的洞察框架的潜在功能。

更新: 看来我可能已经跳了起来。 ASP.NET团队非常热衷于指出我在下面参考的功能是 不是 ASP.NET网页的新实现。网页仍然存在于路线图上,但该特征如何涉及目前不清楚的路线图条目。我将提供进一步的更新,因为澄清了事情。然而,目前,它看起来越来越不太可能对网页的直线替代是计划的。

更新2:网页 has now been removed from the 目前的路线图 所以它看起来像网页不再包含在ASP.NET核心中。

更新3: 剃刀页面 has been released in Preview form。它不是网页,但如果您喜欢网页,剃刀页面非常值得看。

首先要注意的是,将在ASP.NET核心中支持的网页版本尚未正式命名。该功能被称为"Razor Pages" throughout the github问题 (现在改为MVC页面),但问题本身目前标题为"MVC Pages"(现在MVC视图页面)。在里面 .NET核心路线图,它被称为(YUK!)查看页面。术语"Web Pages"它是如此通用,它可以搜索相关信息困难。称之为不同的东西将有助于此功能,并从现有的网页框架中发出非常干净的突破,它与传递相似之处一点相比。模板语法仍将是剃刀,这些文件仍将是CSHTML文件,但也会存在显着的差异。这是一个完全新的框架,而不是现有网页框架的版本递增。我在命名方面的偏好是剃刀页面,因为可能会产生最不困惑。

基于ASP.NET核心,剃刀页面将坐在.NET核心MVC之上。这有两个好处:首先,您将能够建立可以部署在UNIX的剃刀页网站以及Windows服务器,利用.NET核心旨在实现跨平台开发的事实。这为用户提供了他们可以选择选择的托管包中的更大自由。第二个好处是,许多MVC的特征可以在剃刀页面中浮出水面。

MVC功能

那么ASP.NET团队正在考虑通过剃刀页面揭露的关键MVC功能是什么?以下是他们中的一些快速崩溃,看看他们如何改善发展经验。

模型绑定

MVC和Web表单中已经提供了模型绑定。任何已完成涉及表单的Web页面开发的任何人都会超出您必须编写的代码量,以从各种请求集合(表单,QueryString等)从各种请求集合(表单,QueryString等)分配到变量作为参数值数据库操作或其他处理。一个大的Crud网站可以涉及大量这种类型的代码。这很无聊和重复。模型绑定系统为您完成所有这些。

当前提议是添加名为Page操作的功能,该功能以与MVC中的控制器操作类似的方式工作。这些是采用通过模型结合特征来水合的参数的方法。它会像这样做的事情:

@class {
    public IActionResult OnPost(Product product)
    { 
        // do something with product
        return View();
    }
}

This method will execute if the page is requested using the Http POST verb, which is the equivalent to checking the condition if(IsPost) at the moment. The product variable will be auto-magically populated with values from Request.Form. The return View() statement will result in the page content being rendered to the browser.

ActionResults.

An ActionResult is the return type of a Page Action. MVC features a wide variety of different ActionResult types, including a FileResult for returning files to the browser, JsonResult, ContentResult (for returning strings), RedirectResult (which replaces Response.Redirect) and so on. They make life easier in that they set the right ContentType for the browser (except for the FileResult, which you have to specify).

标签

标记表示是生成HTML的可重用组件。他们使用类似HTML的语法。已经有了 许多内置的标记表 对于各种表单字段以及生成链接,管理缓存等。另外,很容易 创造自己的.

强类型的HTML助手

在当前版本的Web页面中,您可以使用HTML帮助程序呈现表单字段:

@Html.TextBox("FirstName")

MVC框架包括所知的强类型版本"model" for the current View. It will be possible to declare the model type for a Razor Page via an @model directive, and then make use of the strongly typed helpers e.g.:

@model Person
...
@Html.TextBoxFor(model => model.FirstName)

The key benefit of this approach is that it provides type safety, with compile-time checking of the helper. In the first example, the code relies on a string. It will fail silently if you attempt to reference the content of the textbox using a different value to the one specified in the helper e.g. Request["ForeName"]. In the strongly-typed example, if you try to use a property name that doesn't exist in the Person class, the code won't compile. Not only that, but strongly typed helpers enable better Intellisense support. When you combine that with Model Binding, you save quite a bit of time and reduce the potential for bugs.

mvc-light. or Razor Web Forms?

ASP.NET团队发布的更有趣的讨论点之一涉及添加A的想法"code-behind"特征。在进一步提问中,似乎这被认为是为了方便代码分离和单元测试。这些是大约8年前引入MVC框架后面的两个关键驱动因素,所以现在它看起来似乎是ASP.NET团队正在考虑添加一个"MVC-Light"选项,其删除具有从控制器类继承的控制器的仪式,并在视图文件夹中的特定位置中查看文件。控制器实际上将是代码背后,控制器和视图之间的一对一关系,这与基于页面控制器模式的Web窗体开发模型非常相似。抛开Web表单的事件驱动方面的缺失,所提出的方法可能会对尚未接受MVC的Web表单开发人员感到非常熟悉 - 特别是当一个人包括使用与服务器控件相似的标记表来使用标签。我敢说它也会在两个方向上挑衅相当多的争论。

我最初有点混淆了这个建议的目的,但现在 Ryan Nowak.达米安爱德华S已经提供了一些更多的解释,我很喜欢看它是如何解决的 - 如果它经过了"idea" phase.

数据访问

介绍了WebMatrix.data作为访问Web页面框架中数据库的主要手段。在剃刀页面框架的数据访问策略方面没有正式提到任何内容,但我希望看到WebMatrix.data移植到.NET核心以启用与剃刀页面的使用。这不会排除使用其他数据访问方法,例如实体框架。如果重用webmatrix.data,则具有异步支持以及接受通用类型参数的一些方法是很好的,以返回强类型的数据,以及动态返回类型e。:

var data = db.QueryAsync<List<Product>>("select * from Products");

或者

var product = db.QuerySingleAsync<Product>("select * from product where id = @0", id);

概括

在介绍下一个版本的网页之前,仍然有一种方法可以进入下一个版本的网页,并且毫无疑问,将从当前呈现的想法列表中添加和删除。如果你想跟上发展, 遵循GitHub问题.