Razor Pages是Core.Net 2.0中引入的一项新功能。 剃刀页面是由标准布局(视图)和后端类组成的页面。 从某种意义上说,它仅在没有状态支持的情况下类似于Web窗体。 该解决方案的优势是显而易见的-我们摆脱了不必要的层-页模型(例如,实体本身就是数据模型)。 页面后端既是控制器又是模型-OOP经典-将数据和使用它们的方法封装在一个对象中。 毕竟,页面模型只是一个类,没有理由使控制器不能成为此类。
换句话说,Razor Pages是一个比MVC更健全的Web解决方案,现在我们正在处理“页面”的传统和逻辑概念,而不是分散在整个项目中的控制器和模型。 但是,由于.NET将朝Core.Net的方向发展,因此Razor Page不太可能出现在标准框架中,尽管事实是,在未来几年中,大多数项目仍将保留在标准.NET上。 但是,可以在标准框架上描述Razor Pages的功能。
该解决方案实际上看起来很简单-您需要向控制器添加以下设计:
protected override void OnActionExecuting(ActionExecutingContext Context) { UpdateModel(this); }
OnActionExecuting方法是生命周期的一个事件,在执行控制器方法之前被调用(意味着请求处理程序-Action)。
UpdateModel直接将请求参数绑定到模型的属性,在本例中为控制器类的属性。
额外的便利-现在完全不需要显式接受Model类型或任何其他类型的参数。 尽管没有什么可以防止这种情况的发生,但是如果参数是一个简单的ID(将纯粹用作局部变量),则必须将参数绑定为控制器的属性,例如,如果需要确保页面的持久性,将在后面讨论。
一个简单的例子:
我们有两个字段的常规登录表单。
标记毫无意义;我只会提供控制器代码
public class AccountController : Controller { public string username{ get; set; } public string userpass{ get; set; } [HttpPost] public ActionResult OnLogin( ) {
如您所见,在触发事件时,输入数据已经绑定并可以使用了。
当然,我们必须记住,现在我们还需要返回控制器作为ActionResult,并在模板中写入控制器类的名称-例如@Model AccountController。
作为该解决方案的结果,还简化了维护请求之间页面状态的任务。 假设您有一个包含特定表的页面,一个按列和分页排序的过滤器。
单击筛选器,模型返回视图,一切都很好,但是当您单击排序时,筛选器自然会重置。 分页器将重置排序和过滤器。 在WebForms中,页面的状态是自动保存的,在MVC中,您必须应用各种繁琐的决策,例如,粘合所有参数并为每个请求驱动它们,也就是说,您需要在排序链接上的过滤器中挂起之前的所有参数。
此类困难是SPA和其他Javascript疯狂的原因之一,这些逻辑和数据将逻辑和数据拖到浏览器中,从而导致浏览器刹车(尤其是移动设备),每次鼠标移动时页面跳动和跳动,并增加了工作的复杂性和成本-因为后端都是相同的以一种或另一种形式编写,打包通过ajax发送的数据,再加上callbac hell,调试的复杂性等,所有这些对于不关心如何访问网站的访问者都没有实际的好处 Isana页面。
最合乎逻辑的解决方案是将页面状态保存在会话中。 由于我们手头有控制器属性形式的所有必要参数,因此我们要做的就是重写OnActionExecuted方法(在处理请求之后调用该方法),并将必要的属性打包到会话中(会话密钥显然必须指向控制器的名称)。
protected override void OnActionExecuted (ActionExecutedContext Context) {
从控制器构造函数中的会话中恢复参数,或者在调用UpdateModel(此)之前恢复参数。 当一个请求到达时,例如排序,新的参数将改变,其余的将保持不变,并且视图将以与发送时相同的形式显示。
这样的解决方案具有更多的便利-例如,用户对表进行了排序,并决定为此打开另一个页面来编辑某些元素。 自然,他想返回到他离开的列表的状态,并且由于该页面的状态在我们的会话中,因此该页面将自动恢复。 不需要像通常那样将整个参数的“转储”传输到编辑页面,反之亦然。 如果不需要在页面之间保存状态,则可以将页面状态不存储在会话中,而可以存储在TempData中。
我希望这些“生活骇客”虽然看起来微不足道,但对初学者来说将是有用的,直到他们在Internet上监视更多不舒服和麻烦的解决方案并决定没有其他解决方案。