ASP.NET WebForms

ASP.NET WebForms 随着微软 2000 年的 .Net Framework 一起发布,至今也将近 20 年的时间。相信很多人和我一样,对 WebForms 有着割舍不掉的感情, 直至今日 WebForms 仍然在管理系统快速开发领域有着不可替代的作用!

基于 ASP.NET WebForms 的 FineUI(开源版)在结束了 9 年 130 个版本的迭代后,继任者 FineUIPro(企业版)也持续了 5 年 30 多个版本的迭代,目前已经非常成熟稳定,超过 300 家企业客户每天都在使用 FineUIPro(企业版)构建各类管理系统。

FineUIPro(企业版)在线示例:https://pro.fineui.com/

为了对比 ASP.NET WebForms,MVC和Core开发页面的差异,下面我们以简单的登录页面为例:

这是一个相当简单的页面,通过如下控件的嵌套组合来显示页面效果:

-Window(登录表单)

----SimpleForm

--------TextBox(用户名)

--------TextBox(密码)

----Toolbar

--------Button(登录)

--------Button(重置)

前台标签化页面代码很简单,注意每个控件都有一个 runat=server 属性:

<f:Window Width="350" WindowPosition="GoldenSection" EnableClose="false" IsModal="false" Title="登录表单" ID="Window1" runat="server">
<Items>
<f:SimpleForm ShowHeader="false" BodyPadding="10" ShowBorder="false" ID="SimpleForm1" runat="server">
<Items>
<f:TextBox ShowRedStar="true" Required="true" Label="用户名" ID="tbxUserName" runat="server"></f:TextBox>
<f:TextBox ShowRedStar="true" Required="true" TextMode="Password" Label="密码" ID="tbxPassword" runat="server"></f:TextBox>
</Items>
</f:SimpleForm>
</Items>
<Toolbars>
<f:Toolbar Position="Bottom" ToolbarAlign="Right" ID="Toolbar1" runat="server">
<Items>
<f:Button Type="Submit" ID="btnLogin" Text="登录" ValidateTarget="Top" ValidateForms="SimpleForm1"
OnClick="btnLogin_Click" runat="server"></f:Button>
<f:Button Type="Reset" Text="重置" ID="btnReset" EnablePostBack="false" runat="server"></f:Button>
</Items>
</f:Toolbar>
</Toolbars>
</f:Window>

后台是经典的事件响应函数:

protected void btnLogin_Click(object sender, EventArgs e)
{
if (tbxUserName.Text == "admin" && tbxPassword.Text == "admin")
{
ShowNotify("成功登录!", MessageBoxIcon.Success);
}
else
{
ShowNotify("用户名或密码错误!", MessageBoxIcon.Error);
}
}

ASP.NET WebForms实现的登录页面:https://pro.fineui.com/#/basic/login.aspx

ASP.NET MVC

也许是为了迎合当下的流行趋势,微软于 2010 年推出了 MVC 架构的 ASP.NET MVC 框架。

我们也在 2016 年推出了支持 ASP.NET MVC 的控件库 FineUIMvc,在线示例:https://mvc.fineui.com/

经典的 MVC 架构,对于 WebForms 开发人员还是有很多新的概念,比如视图,控制器,模型,路由,视图模型,以及微软为了方便路由配置而引入的Areas特性等等。

由此带来的一个重要区别是目录结构不一致:

  • WebForms中,页面(login.aspx)和后台文件(login.aspx.cs)在同一个目录下。
  • MVC中,视图(Login/Index.cshtml)和控制器(LoginController.cs)分别在不同的目录下。

下面两幅图片展示了这种差别:

可以毫不客气的说,MVC中的这种做法虽然更加接近传统的MVC味道,但是对开发人员却不友好!

FineUIMvc中的视图对应于 WebForms 的页面,使用的是 Razor Html Helpers ,下面来看下登录页面的视图代码:

@(F.Window().Width().WindowPosition(WindowPosition.GoldenSection).EnableClose(false).IsModal(false).Title("登录表单").ID("Window1")
.Items(
F.SimpleForm().ShowHeader(false).BodyPadding().ShowBorder(false).ID("SimpleForm1")
.Items(
F.TextBox().ShowRedStar(true).Required(true).Label("用户名").ID("tbxUserName"),
F.TextBox().ShowRedStar(true).Required(true).TextMode(TextMode.Password).Label("密码").ID("tbxPassword")
)
)
.Toolbars(
F.Toolbar().Position(ToolbarPosition.Bottom).ToolbarAlign(ToolbarAlign.Right).ID("Toolbar1")
.Items(
F.Button().OnClick(Url.Action("btnLogin_Click"), "SimpleForm1").ValidateTarget(Target.Top).ValidateForms("SimpleForm1").Type(ButtonType.Submit).Text("登录").ID("btnLogin"),
F.Button().Type(ButtonType.Reset).Text("重置").ID("btnReset")
)
)
)

是的,其实这里的视图就是 C# 的函数调用而已,虽然很灵活,但是和我们之前所认知的标签写法有很大的出入。

WebForms和MVC另一个重要的区别点:

  • WebForms通过 ViewState 来保持前后台控件的状态,因此在后台事件处理函数中,可以方便的拿到页面上每个控件的属性!
  • MVC的实现更加轻量级,后台对于前台状态一无所知,任何后台需要的状态都需要前台显式传入!

这个重要的差异点体现在 OnClick 函数的第二个参数 SimpleForm1,它告诉 FineUIMvc 把 SimpleForm1 里面所有子控件的关键数据传入后台。

下面看下后台代码,对应于控制器方法:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult btnLogin_Click(IFormCollection values)
{
if (values["tbxUserName"] == "admin" && values["tbxPassword"] == "admin")
{
ShowNotify("成功登录!", MessageBoxIcon.Success);
}
else
{
ShowNotify("用户名或密码错误!", MessageBoxIcon.Error);
} return UIHelper.Result();
}

ASP.NET MVC实现的登录页面:https://mvc.fineui.com/#/Basic/Login

ASP.NET Core (Razor Pages & Tag Helpers)

2016年,微软在新领袖纳德拉的领导下,走上了开源之路,并推出重量级的跨平台开源框架 .Net Core!

作为 ASP.NET MVC 的继任者,ASP.NET Core 不仅开源免费,而且可以在  Windows、macOS 和 Linux 上开发和部署,这是前几年做梦都想不到的事情。

FineUI紧跟历史潮流,及时于 2017 年推出了支持 ASP.NET Core 的控件库 FineUICore,在线示例:https://core.fineui.com/

然而 WebForms 和 MVC 之间的鸿沟,阻止了很多 WebForms 开发人员的升级之路。

微软应该是深刻认识到了这一点,在ASP.NET Core 2.0版本中推出了 Razor Pages,简化了Controller-View-Model的组织结构,现在看起来更有WebForms的感觉了:

本着一切为了简化开发人员的劳动,FineUICore终于在近期发布的 v5.5.0 完美支持 ASP.NET Core 的 Razor Pages 和 Tag Helper!

FineUICore with Razor Pages & Tag Helper 的在线示例:https://pages.fineui.com/

我们的目的是让 ASP.NET Core 的页面和 ASP.NET WebForms 的页面看起来尽量一致,这样可以大大减轻开发人员从 ASP.NET WebForms 迁移到 ASP.NET Core 的繁重劳动!

看下 FineUICore 实现的登录页面代码:

<f:Window Width="350" WindowPosition="GoldenSection" EnableClose="false" IsModal="false" Title="登录表单" ID="Window1">
<Items>
<f:SimpleForm ShowHeader="false" BodyPadding="10" ShowBorder="false" ID="SimpleForm1">
<Items>
<f:TextBox ShowRedStar="true" Required="true" Label="用户名" ID="tbxUserName"></f:TextBox>
<f:TextBox ShowRedStar="true" Required="true" TextMode="Password" Label="密码" ID="tbxPassword"></f:TextBox>
</Items>
</f:SimpleForm>
</Items>
<Toolbars>
<f:Toolbar Position="Bottom" ToolbarAlign="Right" ID="Toolbar1">
<Items>
<f:Button Type="Submit" ID="btnLogin" Text="登录" ValidateTarget="Top" ValidateForms="SimpleForm1"
OnClick="@Url.Handler("btnLogin_Click")" OnClickFields="SimpleForm1"></f:Button>
<f:Button Type="Reset" Text="重置" ID="btnReset"></f:Button>
</Items>
</f:Toolbar>
</Toolbars>
</f:Window>

等等!这不就是前面的 WebForms 页面代码吗???哦,不对,少了 runat=server,然后,....嗯....,没有然后了。

为了对比登录页面在 ASP.NET WebForms 和 ASP.NET Core 下的差异,我们用对比工具测试了一下:

这里能看到的差异点只有两个:

  • ASP.NET WebForms的控件多了个runat=server属性
  • ASP.NET Core的控件事件处理有点差别,需要指定传入后台的参数(OnClickFields)

是不是很简单,现在不用怕从 WebForms 升级到 ASP.NET Core了吧!

而后台的事件处理函数(嗯,这个是WebForms的术语,MVC中叫控制器方法,ASP.NET Core with Razor Pages可称之为页面模型处理器)和 MVC 的保持一致:

public IActionResult OnPostBtnLogin_Click(IFormCollection values)
{
if (values["tbxUserName"] == "admin" && values["tbxPassword"] == "admin")
{
ShowNotify("成功登录!", MessageBoxIcon.Success);
}
else
{
ShowNotify("用户名或密码错误!", MessageBoxIcon.Error);
} return UIHelper.Result();
}

说白了,FineUICore的一切努力都是为了简化开发人员的劳动,让 ASP.NET Core 有一副 WebForms 的清纯外表和MVC的火热内心!

ASP.NET Core实现的登录页面:https://pages.fineui.com/#/Basic/Login

再来看另一个页面的代码对比:

这两个页面分别来自:

FineUIPro:https://pro.fineui.com/#/panel/panel_group.aspx

FineUICore:https://pages.fineui.com/#/Panel/Group

示例源代码下载

以上介绍的三个产品并非免费软件,你可以加入【三石和他的朋友们】知识星球下载基础版(基础版下载后可永久免费商用!):

延伸阅读

将 ASP.NET Core 2.1 升级到最新的长期支持版本ASP.NET Core 3.1

ASP.NET Core 快速入门(FineUICore + Razor Pages + Entity Framework Core)

AppBoxCore - 细粒度权限管理框架(EFCore+RazorPages+async/await)!

不忘初心,方得始终!

【基础版限时免费】致敬WebForms,ASP.NET Core也能这么玩!的更多相关文章

  1. 基础教程:视图中的ASP.NET Core 2.0 MVC依赖注入

    问题 如何在ASP.NET Core MVC Views中注入和使用服务. 解 更新 启动 类来为MVC添加服务和中间件. 添加一项服务 添加一个Controller,返回 ViewResult. 添 ...

  2. 基础教程:上传/下载ASP.NET Core 2.0中的文件

    问题 如何上传和下载ASP.NET Core MVC中的文件. 解 在一个空的项目中,更新 Startup 类以添加MVC的服务和中间件. publicvoid ConfigureServices( ...

  3. 从来也科技UiBot 6.0社区版全线免费,看RPA距离“人人可用”还有多远

    来也科技RPA产品UiBot 6.0社区版全线免费,背后的逻辑是什么? 来也科技CPO褚瑞:开发者生态才是RPA厂商的真正护城河 来也科技UiBot 6.0社区版全线免费,RPA距离真正人人可用还有多 ...

  4. 从头编写 asp.net core 2.0 web api 基础框架 (1)

    工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...

  5. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (1)

    工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...

  6. 《ASP.NET Core 3框架揭秘》读者群,欢迎加入

    作为一个17年的.NET开发者,我对一件事特别不能理解:我们的计算机图书市场充斥着一系列介绍ASP.NET Web Forms.ASP.NET MVC.ASP.NET Web API的书籍,但是却找不 ...

  7. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

    ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...

  8. 【译】.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容

      .NET Core 3.0 Preview 3已经推出,它包含了一系列关于ASP.NET Core的新的更新. 下面是该预览版的更新列表: Razor组件改进: 单项目模板 新的Razer扩展 E ...

  9. ASP.NET Core 简单引入教程

    0.简介 开源.跨平台 1.环境安装 参考官方教程   Core 官方文档 2.向世界问个好 sheel/cmd 下: dotnet --help // 查看帮助 dotnet new *     / ...

随机推荐

  1. DotnetBrowser高级教程-(4)使用MVC框架3-文件上传

    网站有时候需要上传文件,本节以上传一张图片为例,在UserController.cs里添加如下代码: public string UploadImgPage() { return "< ...

  2. JS方面重点摘要(二)

    1.函数声明与函数表达式 (1)变量声明会置顶提前,但赋值仍在原地方(2)函数声明同变量声明一样会提前:但是,函数表达式没有提前,就相当于平时的变量赋值(3)函数声明会覆盖变量声明,但不会覆盖变量赋值 ...

  3. asp.net购物车,订单以及模拟支付宝支付(四)---模拟支付宝支付

    下完订单之后到支付宝付款,成功之后再返回来修改订单状态.由于只是测试,所以就没有真正的连接到支付宝,用的是一个模拟支付宝的程序 下载地址:支付宝模拟程序 这是一个vs2010的项目,本来网上找了一个模 ...

  4. setContentView

    setContentView(R.layout.main)在Android里面,这句话是什么意思? R.layout.main是个布局文件即控件都是如何摆放如何显示的,setContentView就是 ...

  5. [PWA] Add Push Notifications to a PWA with React in Chrome and on Android

    On Android and in Chrome (but not on iOS), it's possible to send push notifications with a PWA. We'l ...

  6. 使用Fiddler作为简单的mockserver

    转载:  http://blog.csdn.net/xt0916020331/article/details/66544526 开发中经常遇到调试过程中对接系统接口无法联调或者后台未开发完成等情况.这 ...

  7. C++003基础

    1.C++对C的扩展 1简单的C++程序 1.1求圆的周长和面积 数据描写叙述: 半径.周长,面积均用实型数表示 数据处理: 输入半径 r. 计算周长 = 2*π*r : 计算面积 = π* r2 . ...

  8. C4:原型模式 Prototype

    用原型实例指定创建对象的种类,并且拷贝这些原型创建新的对象.应用场景: A.用new创建对象通常有较为复杂的数据准备或权限准备B.对象较大,拷贝对象可以节省内存 UML图: class WorkExp ...

  9. 扩充STL-编写自己的迭代器

    这里的迭代器能够与STL组件共同工作,是对STL的一种扩充.   自定义迭代器必须提供iterator_traits的五种特性,分别是迭代器类型.元素类型.距离类型.指针类型与reference类型. ...

  10. 工业控制系统USB存储设备可信管理方案的(ICICS2015)论文PPT:TMSUI: A Trust Management Scheme

    本PPT是发表在ICICS2015 大会的论文 TMSUI: A Trust Management Scheme of USB Storage Devices for Industrial Contr ...