WebForms Core 1.9 和 CodeBehind 4.3 已发布

31 阅读20分钟

介绍 WebForms Core是对传统服务器端 UI 模型的大胆重新定义,它利用了以下现代概念:

无国籍 粒度命令传输 优化控制的SSR和CSR组合 轻量级、紧凑的语义协议 命令/执行抽象层 它试图为 Web 开发引入一种新标准,既保留了后端开发人员的简单性,又确保了前端的效率和交互性。

WebForms 核心与代码隐藏 WebForms Core 是一项革命性的服务器技术,用于管理 HTML 中的 DOM 元素。CodeBehind是一个.NET下的后端框架,它将 WebForms Core 技术融入其核心(有了这项技术,它就成了全栈的)。WebForms Core 和 CodeBehind 均属于Elanat。

通常,Elanat 会先同时开发 WebForms Core 技术与 CodeBehind 框架,然后再发布其他服务器编程语言的 WebForms 类的新版本。因此,CodeBehind 框架 4.3 版本与 WebForms Core 技术 1.9 版本同时发布。

WebForms Core 技术 1.9 版与上一版本完全相同,新增了一些功能。未来,我们还将发布 2.0 版,其中包含更多全新且丰富的功能,使 WebForms Core 技术能够真正超越前端框架。后续版本也将推出新功能,但 Elanat 的重点仍将放在改进这项技术的架构上。

CodeBehind 版本 4.3 中的新功能: 代码隐藏 4.3

仅以 GET 方法查看 4.3 版本新增了一个实用的功能,可以防止视图提交。在此新功能中,当请求不是 GET 请求(例如 POST 和 PUT 等其他方法)时,视图会被忽略,但写入页面的响应会包含在服务器响应中。这是一种与 WebForms Core 技术或前端框架兼容的结构。

此功能默认是禁用的,要启用它,您需要将位于“code_behind”目录中的选项文件中的“end_view_only_in_get_method”的值设置为“true”。

选项.ini

[CodeBehind options]; do not change order view_path=wwwroot move_view_from_wwwroot=true rewrite_aspx_file_to_directory=true ... max_web_socket_connections_per_client=3 web_socket_buffer_size=4096 +send_view_only_in_get_method=false 在这种情况下,不需要禁用View和Model以及Layout,因为任何不是GET方法的请求都会忽略View和Layout。

Write(form.Response());

-IgnoreLayout = true; -IgnoreViewAndModel = true; 在View中编写方法 虽然在视图中显示数据很容易,但是,当启用“仅使用 GET 方法显示视图”功能时,就无法再使用视图页面将响应写入输出(您需要添加控制器或模型);为了解决这个新问题,我们启用了将数据写入视图页面的功能。“仅使用 GET 方法显示视图”功能会考虑在视图之外写入页面的数据,并发送这些响应。

从现在开始,您还可以使用“写入”方法在视图中写入输出!

忽略 PostBack 的布局 在此版本中,我们添加了阻止布局提交的功能,以便构建 SPA 系统拥有更强大的架构。要支持此功能,只需调用新方法“IgnoreLayoutForPostBack”。“IgnoreLayoutForPostBack”方法在 Controller、Model 和 View 三个部分均可用。

众所周知,WebForms Core 技术中的请求会使用值为“true”的“Post-Back”标头进行请求;“IgnoreLayoutForPostBack”方法的作用是,如果存在此标头,则不会重新提交布局。这是一种很好的机制,可以防止重新提交 HTML 结构模板。

IgnoreLayoutForPostBack(context.Request.Headers); 例子

在此示例中,如果首次请求“关于”页面,则 HTML 会完整生成;但如果使用 WebForms Core 结构(基于 SPA 链接,下文将解释)请求同一页面,则布局会被禁用。假设我们先调用联系页面,然后在 WebForms Core 下请求“关于”页面,则当前布局会保留,没有布局的“关于”页面会被联系页面替换。

布局(“/layout.aspx”)

@page @islayout

@WebSiteName - @ViewData.GetValue("title") page

@WebSiteName - @ViewData.GetValue("title")

@PageReturnValue 看法

@page @controller AboutController @layout "/layout.aspx" @{ ViewData.Add("title","About"); }

We are a passionate team dedicated to delivering high-quality digital solutions. Our mission is to help businesses grow by providing innovative web design, software development, and content creation services.

With a focus on creativity, integrity, and customer satisfaction, we strive to build long-lasting relationships and create meaningful experiences for our clients.

在这种情况下,您需要添加一个条款来更改 HTML 标题,在本例中还包括 h1 标签。在​​本例中,我们通过指定一个简单的条件来发送两个操作控制命令。

控制器(AboutController)

using CodeBehind;

public partial class AboutController : CodeBehindController { public void PageLoad(HttpContext context) { IgnoreLayoutForPostBack(context.Request.Headers);

    if (IgnoreLayout == true) // Note: is {public bool? IgnoreLayout = null;} and {if (IgnoreLayout)} get compiler error
    {
        WebForms form = new WebForms();

        // Consider WebSiteName as a global variable
        form.SetHeadTitle($"{WebSiteName} - About");
        form.SetText("<h1>", $"{WebSiteName} - About");

        Write(form.ExportToWebFormsTag());
    }
}

} 请注意,在 WebForms Core 技术中,任何非操作控件(文本开头不包含“[web-forms]”)的数据都放置在响应位置部分;响应位置默认为 body,因此,由于我们希望将页面放置在“main”标签中,因此需要将设置从 body 更改为“main”标签。为此,我们需要在 WebFormsJS 配置部分中添加以下设置:

WebFormsJS 选项部分

var PostBackOptions = new Object(); PostBackOptions.UseProgressBar = true; ... PostBackOptions.UseSPALink = true; ... function cb_GetResponseLocation() {

  • return document.body;
  • return document.getElementsByTagName("main")[0]; } WebForms Core 1.9 版中的新功能: WebForms 核心 1.9

瞬态 DOM Transient DOM 是此版本新增的一项强大功能。我们之前承诺添加此功能,现在我们终于兑现了承诺。

在 Transient DOM 中,更改只需收集并应用一次,从而减少闪烁和反射。此新功能基于 JavaScript 中的 Clone 功能创建,使 DOM 更改像前端框架中的虚拟 DOM 一样流畅。

虽然 React 等前端框架使用虚拟 DOM ,而 Angular 使用增量 DOM,但 WebForms Core 提供了瞬态 DOM功能,以避免执行动作控制代码层次结构,并通过创建临时克隆来保存多个命令,然后将它们应用到 HTML 页面,从而最大限度地减少直接 DOM 操作。

例子

HTML

Simple Article Page

My Website ...

Impact of Artificial Intelligence on Daily Life

Category: Technology

Date: October 2, 2025

Artificial Intelligence is rapidly transforming the way we interact with technology. From voice assistants to self-driving cars, AI is entering various aspects of our daily lives and creating new opportunities to improve quality of life.

要使用 Transient DOM,我们首先调用“StartTransientDOM”方法,并设置 InputPlace。在本例中,选择了带有容器类的 div 标签。请注意,从现在开始,我们只需要操作容器标签内的元素,而无需访问容器标签外部的元素,并且根元素将作为容器放置在此处。编写命令后,我们调用“EndTransientDOM”方法。

服务器代码

... form.StartTransientDOM("{container}");

form.SetBackgroundColor("

", "pink"); form.SetFontSize("1", 24); form.SetWidth("

2", 300); form.SetFontName("

2", "Tahoma"); form.AddStyle("

2", "line-height: 1.5;");

form.EndTransientDOM(); ... 注意:在这个例子中,如果我们不使用Transient DOM特性,调用该form.SetWidth("

2", 300);方法将导致设置页面第三个p标签(包括日期)的宽度!

在这种情况下,为了访问和管理主标签(此处

),我们添加了一个新的 InputPlace 类型。

WebForms form = new WebForms();

form.StartTransientDOM("{container}");

form.SetBackgroundColor("

", "pink"); form.SetFontSize("", 24); form.SetWidth("

2", 300); form.SetFontName("

2", "Tahoma"); form.AddStyle("

2", "line-height: 1.5;"); +form.SetBackgroundColor(InputPlace.Root, "lightgreen"); // or form.SetBackgroundColor("~", "lightgreen");

form.EndTransientDOM(); SPA模式 此版本具有状态管理的高级功能,包括后退和前进按钮,以及用于存储标题、页面的垂直和水平位置等数据的状态,以及在浏览器中更改 URL,所有这些都是自动的。

WebFormsJS 库设置部分还添加了一个新选项,用于启用 SPA 链接(默认启用)。启用此设置将导致所有没有目标或目标类型为“_self”的内部链接仅基于“GetBack”方法自动工作。

WebFormsJS 选项部分

var PostBackOptions = new Object(); PostBackOptions.UseProgressBar = true; ... PostBackOptions.AddLog = true; PostBackOptions.AddLogForWebSockets = true; +PostBackOptions.UseSPALink = true; 这些功能使得使用 WebForms Core 构建的应用程序具有与现代 SPA 应用程序类似的体验,而没有 React 或 Angular 等重型框架的复杂性。

过去,人们可能很难相信服务器端技术能够实现 SPA 功能,但 Elanat 已经证明这完全可行且合乎逻辑。SPA 最初诞生时,主要与 React、Angular 或 Vue 等客户端框架相关,但现在,Elanat 的 WebForms Core 等技术已经证明,即使是服务器端架构也能通过智能设计提供类似 SPA 的体验。WebForms Core 框架的改进允许无需刷新整个页面即可进行交互,而对浏览器状态和历史记录的智能管理则创造了流畅而现代的体验。这是一个令人惊叹的转变。

注意:我们将在未来的单独文章中讲授 SPA 功能。

忠实于 RESTful REST(表述性状态转移)架构是一种 Web 服务设计风格,它使用 HTTP 协议在客户端和服务器之间进行通信。在这种架构中,资源通过 URL 标识,并使用 GET、POST、PUT 和 DELETE 等操作与资源进行交互。REST 简单、可扩展且独立于平台,由于其清晰的结构和对 Web 标准的遵循而广受欢迎。

在 1.9 版本中,我们添加了几个新方法以全面支持 REST 架构。 除了 PostBack(通过发送 POST 标头)和 GetBack(通过发送 GET 标头)之外,此版本还添加了以下方法:

通过发送 PUT 标头来“ PutBack ” 通过发送 PATCH 头来“ PatchBack ” 通过发送 DELETE 标头来“ DeleteBack ” 通过发送 HEAD 标头来“ HeadBack ” 通过发送 OPTIONS 标头来“ OptionsBack ” 通过发送 TRACE 标头进行“ TraceBack ” 通过发送 CONNECT 标头来“ ConnectBack ” WebForms Core 技术现在完全基于 RESTful 架构的核心原则运行。这一演变使 WebForms Core 成为一个完全符合现代 Web 标准的强大平台。

客户端/服务器: WebForms Core 架构完全解耦;客户端(WebFormsJS)和服务器(WebForms 类)之间的通信是通过定义的接口完成的。 无状态:请求通过小命令(INI 格式)发送XMLHttpRequest,响应以小命令(INI 格式)返回,与客户端的先前状态无关。 缓存:对于缓存,您可以使用服务器上的 WebForms 类中的 SetCache 方法或服务器自己的缓存。 统一接口:与 DOM 的交互是通过动作控件和被视为统一接口的特定结构完成的。 分层系统:从该技术的角度来看,请求是否到达中途的代理、被附加层拦截或被缓存都没有区别;因此,无论是否存在中间层,它都会继续发挥作用。 按需代码(可选):服务器可以将逻辑以命令的形式发送到客户端在WebFormsJS中执行,完全基于这个原理。 请注意:有趣的是,该服务器是无状态的,但功能与有状态服务器一样强大。此外,WebForms Core 明确将REST 中的按需代码限制定义为可选;服务器将“代码”(此处为 INI 命令)发送到客户端,该代码由 WebFormsJS 执行。因此,它以比 REST 更强大的方式实现了此限制。

例子

服务器命令

form.SetDeleteEvent("", "onclick", "/products/1"); 在服务器上处理请求

using CodeBehind;

public partial class ProductsController : CodeBehindController { public void PageLoad(HttpContext context) { if (context.Request.Method == "DELETE") { string Id = Section.GetValue(0); // Delete in Database // ...

        WebForms form = new WebForms();

        form.Delete(InputPlace.Target); // or form.Delete("!");

        Write(form.Response());

        IgnoreLayout = true;
        IgnoreViewAndModel = true;

        return;
    }

    if (context.Request.Method == "PUT")
    {
        // ...
    }
}

} 在此示例中,SetDeleteEvent服务器端的方法定义了当用户点击按钮时,DELETE应向该路径发送请求/products/1。这意味着客户端(WebFormsJS)是 RESTful 的,并使用适当的方法执行资源的删除。

在服务器端,ProductsController控制器检查请求方法是否为DELETE。如果是:

从请求中提取产品 ID。 删除操作是从数据库中执行的。 然后,使用WebForms该类,在客户端发出 DOM 删除命令(例如,删除按钮或关联元素)。 响应作为 INI 发送到客户端以便在 WebFormsJS 中执行。 此示例展示了如何DELETE使用 WebForms Core 以完全 RESTful 的方式实现该方法,并将执行逻辑从服务器移动到客户端。

状态控制的条件特征 此版本最重要的功能是支持条件以及条件的异步和同步功能。从现在起,可以根据条件执行或停止命令。我们还在 WebForms Core 技术中添加了基于持续时间创建条件的功能。

例子

在这个例子中,执行确认命令后,依赖命令以异步模式执行,依赖命令以同步模式执行(因此更早)。

服务器命令

form.ConfirmIsTrueAccept("Are youe want show success message?"); form.Message("You are accept to show this success message", "success"); 确认图像 确认

结果图像 信息

我们可以为 Confirm 添加自定义选项。 “ConfirmIsTrueAccept”方法的参数如下:

确认文本。 确定确认的颜色的类型,并将颜色更改为红色、黄色、蓝色、绿色和灰色,并带有警告、问题、帮助、成功和无字样(默认为无)。 确认标题。 确认按钮的单词或短语。 单词或短语取消按钮。 间隔(默认为 100 毫秒) 服务器命令

form.ConfirmIsTrueAccept("Are youe want show three success message?"); form.StartBracket(); form.Message("You are accept to show this success message1", "success"); form.Message("You are accept to show this success message2", "success"); form.Message("You are accept to show this success message3", "success"); form.EndBracket(); 结果图像 消息

依赖命令 依赖命令根据编程语言中的条件执行。如果在条件函数之后执行“StartBracket”方法,则如果条件满足,则命令将一直执行,直到“EndBracket”方法结束;如果条件不满足,则所有命令都不会执行;因此,在这种情况下,依赖命令位于“StartBracket”方法和“EndBracket”方法之间。如果未使用“StartBracket”方法,则只有下一个命令才是依赖命令。

除了 Confirm 之外,我们还可以使用其他几个条件属性,这些属性列出如下:

ConfirmIsTrueAccept - 用户单击“确认”按钮后执行相关命令 ConfirmIsFalseAccept - 用户单击“取消”按钮后执行相关命令 IsTrue - 如果依赖命令为真,则执行它们 IsFalse - 如果依赖命令不成立,则执行它们 IsGreaterThan - 如果第一个数据大于第二个数据,则执行相关命令 IsLessThan - 如果第一个数据小于第二个数据,则执行相关命令 IsEqualTo - 如果第一个数据和第二个数据相等,则执行相关命令 IsRegexMatch - 如果数据基于正则表达式模式,则执行相关命令 IsRegexNoneMatch - 如果数据不是基于正则表达式模式,则执行相关命令 除了“确认”之外,其他条件属性还包括“检查间隔”。该功能根据指定的时间间隔按顺序执行。此版本还添加了“中断”命令,如果执行该命令,则会阻止“操作控制”命令的继续执行。

“ConfirmIsFalseAccept”方法的功能与“ConfirmIsTrueAccept”方法类似,不同之处在于它允许在用户单击“取消”按钮时执行相关命令。

例子

在此示例中,IsEqualTo 函数检查生成的随机数是否等于所需值,并在指定的时间间隔(例如 100 毫秒)内执行此检查。如果满足条件,则使用 Message 显示一条成功消息,表明随机函数测试已正确执行。请注意,如果启用 Interval,则相关命令将异步执行。

服务器命令

form.IsEqualTo(Fetch.Random(0, 100), "1", 100); form.Message("IsTrue work fine in Random method", "success"); 例子

在下面的例子中,我们暂时存储textarea的文本,然后使用IsTrue方法检查存储的数据是否有值。如果成功,textarea的背景颜色将变为绿色。

服务器命令

form.SaveValue("Textarea1", "my-key");

form.IsTrue(Fetch.Saved("my-key"), 100); form.SetBackgroundColor("Textarea1", "lightgreen"); 在活动中确认 在此版本中,新增了向事件添加“确认”的功能,该功能可继续或阻止事件。要使用此新功能,我们必须先向标签添加事件,然后添加“AssignConfirmEvent”方法。目前,仅在内部标签事件上启用了添加“确认”的功能。在未来的版本中,我们还将添加一种机制,以支持在事件监听器中添加“确认”。

例子

本例中,点击Button后,显示Confirm内容;如果用户点击了Confirm按钮,则执行该事件,否则不执行该事件。

服务器命令

form.SetGetEvent("Button1", HtmlEvent.OnClick, "?button_click"); form.AssignConfirmEvent("Button1", HtmlEvent.OnClick, "Are you sure?", "warning"); 我们可以为 Confirm 添加自定义选项。 “AssignConfirmEvent”方法的参数如下:

输入地点 HTML 事件 确认文本。 确定确认的颜色的类型,并将颜色更改为红色、黄色、蓝色、绿色和灰色,并带有警告、问题、帮助、成功和无字样(默认为无)。 确认标题。 确认按钮的单词或短语。 单词或短语取消按钮。 我们还可以通过调用“RemoveConfirmEvent”方法从按钮中删除确认。

form.RemoveConfirmEvent("Button1", HtmlEvent.OnClick); 调用 WebAssembly 方法 调用 WebAssembly 方法是此版本新增的功能。WebAssembly 可在浏览器中实现快速、近乎原生的执行(无需安装插件),并且在有限的浏览器环境中也能提供高安全性和可用性。

在此版本中,我们支持所有在创建 WebAssembly 方面具有稳定状态的编程语言。 您可以在下面的列表中看到这些:

C/C++ C# 锈 Java AssemblyScript 去 重要的一点是,WebForms Core 技术中的 WebAssembly 调用结构可以以高级和自动的方式同时具有字符串输入参数和字符串输出。

例子

这是一个调用用 GO 编程语言创建的 WebAssembly 的示例。方法名为 add,它将两个输入参数相加并返回结果。

HTML

WASM Result: 服务器命令

form.CacheWasmMethodResult(WasmLanguage.GO ,"/web-assembly/hello_world_bg.wasm", "add", ["5000", "3"]); form.AddText("", Fetch.Cache()); form.AssignDelay(.1f); // By seconds 结果

HTML

WASM Result: 5003 您也可以使用单词“go”代替“WasmLanguage.GO”。

form.CacheWasmMethodResult("go" ,"/web-assembly/hello_world_bg.wasm", "add", ["5000", "3"]); 在此示例中,我们首先调用 WASM 方法,然后缓存该方法的输出,然后将该方法的缓存输出添加到 b 标签,延迟 100 毫秒。请注意,WebAssembly 调用在浏览器中是异步完成的,如果方法执行速度较慢,则应使用 while 条件持续检查缓存,直到输出被缓存,然后在内容中执行插入操作。

“CacheWasmMethodResult” 方法永久存储 WASM 方法的输出。您也可以使用“SaveWasmMethodResult” 方法仅在浏览器处于活动状态时临时存储数据。

这两个方法的参数是:

编程语言的名称,包括“c”(代表 C/C++)、“rust”、“csharp”、“go”、“java”和“as”(代表 AssemblyScript)。 WASM 文件的路径 WASM 方法的名称 方法的输入参数 密钥的名称 请注意,您必须为缓存或保存选择一个名称,以避免与其他存储行为发生冲突。

例子

服务器命令

form.SaveWasmMethodResult(WasmLanguage.GO ,"/web-assembly/hello_world_bg.wasm", "add", ["5000", "3"], "my-wasm-key"); form.AddText("", Fetch.Saved("my-wasm-key")); form.AssignDelay(.1f); // By seconds 注意:与 JavaScript 不同,WebAssembly 不能独立运行,需要宿主提供与其交互所需的接口。

注意:我们很快将在单独的文章中将如何创建 WebAssembly 添加到支持的编程语言列表中。

调用方法 此版本添加了 CallMethod 方法,以便更高级地调用 JavaScript 方法。

例子

HTML

Your name is

服务器命令

form.AddText("

", Fetch.CallMethod("prompt", ["Please enter the name", "Your name"])); 来电提示功能图片 调用 JavaScript 函数

结果

HTML

Your name is Jonathan

上部特征 正如之前承诺的那样,我们添加了 Upper 功能,使用短划线“-”来选择上方的 InputPlace。这减少了从服务器到客户端的带宽。

使用

// Pattern // InputPlace.Upper // -

// Example form.AddOptionTag(InputPlace.Tag("select"), "Text1", "Value1"); form.AddOptionTag(InputPlace.Upper, "Text2", "Value2");

// Or Use form.AddOptionTag("", "Text1", "Value1"); form.AddOptionTag("-", "Text2", "Value2"); 结果 当我们使用 Upper [web-forms] ao=Value1|Text1 ao-=Value2|Text2 当我们不使用 Upper

[web-forms] ao=Value1|Text1 ao=Value2|Text2 在此示例中,第二个 Action Control 中使用了破折号“-”代替字符串。如您所见,这减少了从服务器到客户端的带宽。WebForms Core 允许我们连续使用多个破折号“-”。 添加消息和警报 有了 Message 和 Alert 的加入,您不再需要为这些任务创建模板或复杂的 Action Controls。您可以通过调用服务器上的 WebForms 方法向用户显示 Message 和 Alert。 例子 警报 form.Alert("My alert 1"); form.Alert("My alert 2", "help", "Alert Title", "Yes"); 警报出现在屏幕中央,并使侧面的空间变暗。 警报图像 警报 如您所见,我们在第二个 Alert 中添加了自定义选项。Alert 方法的参数如下: 警报文本。 确定警报颜色的类型,并将颜色更改为红色、黄色、蓝色、绿色和灰色,并带有警告、问题、帮助、成功和无字样(默认为无)。 警报标题。 确认按钮的单词或短语。 自定义图像 自定义图像 信息 form.Message("My message 1"); form.Message("My message 2", "warning", 2000); 消息出现在屏幕的中央和顶部。 消息图像 信息 如您所见,我们为第二条消息添加了自定义选项。 该消息方法的参数如下: 消息文本。 确定消息颜色的类型,并将颜色更改为红色、黄色、蓝色、绿色和灰色,并带有警告、问题、帮助、成功和无字样(默认为无)。 消息显示的持续时间(以毫秒为单位,并在指定时间后自动删除)。 交换两个标签的可能性 在此版本中,添加了交换两个标签(即改变它们的位置)的功能,并保证保留状态并保留事件监听器。 例子 Bold text one Bold text two Bold text three Bold text four Bold text five Italic text one Italic text two Italic text three Italic text four Italic text five 下面的代码指的是将第 4 个标签(索引从 0 开始,因此3是第四个)与第 2 个标签(1)交换。 form.SwapTag("3", "1"); 结果 交换是位置交换,这意味着两个元素在各自的父容器中交换位置。 Bold text one Bold text two Bold text three Italic text two Bold text five Italic text one Bold text four Italic text three Italic text four Italic text five 注意:请注意索引从[0]开始! 增加了对头部部分的访问 从 1.9 版本开始,您还可以访问 head 部分。在下面的示例中,InputPlace.Head我们定义了 head 部分,并为其添加了一个样式标签。下面我们来定义新的样式。 form.AddTag(InputPlace.Head, "style", "Style1"); form.AddText("Style1", "body{margin: 20px;}"); InputPlace.Head我们可以使用字符来代替^。 form.AddTag("^", "style"); form.AddText("^", "body{margin: 20px;}"); 增加了更改标题的功能 要设置标题,您可以使用SetHeadTitle方法而不是访问头部部分。 form.SetHeadTitle("New title"); 允许 WebFormsJS 模块化开发 此版本新增了一项功能,允许开发人员开发模块化的 WebFormsJS。我们在 WebFormsJS 库的末尾添加了一个名为 Extension 的部分,并包含了几种用于扩展 WebForms Core 技术的方法。 注意:我们将在未来的单独文章中讲授这一新功能。 调用内部脚本 在这个版本中,我们还提供了在添加标签和URL内容时调用脚本的功能,以便我们能够以最佳的方式调用带有脚本标签的页面。 一系列小功能和改进 在此版本中,WebFormsJS 库的部分内容被重写,许多部分得到了改进。服务器端 WebForms 类的一些方法也被重写,以提高 Action Control 结构的执行速度。 此版本解决的问题 表单标签中需要操作属性的问题已得到解决。 WebFormsJS 中获取随机数的问题已解决。 版本 4.3.1 动作控制中 alert 和 label 之间的名称匹配问题已在 4.3.1 版本中修复。 “EndTransientDOM”和“CallMethod”方法也已修改。IsTrue 和 IsFalse 方法的问题也已解决。 我们还发现有必要添加“IsRegexNoneMatch”条件属性。查看更多https://www.mjsyxx.com