FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 10015|回复: 6

FineUIMvc可以像FineUI一样任意的访问控件属性

[复制链接]
发表于 2017-5-10 12:33:15 | 显示全部楼层 |阅读模式
本帖最后由 棕榈 于 2017-5-10 13:00 编辑

用过FineUI(WebForm)都知道,服务器端可以任意访问控件的属性,而FineUIMvc却不可以,这是因为WebForm在每一次回发时,会将所有控件属性回发到服务器端,服务器端根据回发的数据重现控件的状态,这样服务器端就可随意访问控件的属性了,而MVC的数据回发则由用户自己控制,你回发什么数据,服务器端才能访问什么数据,这样就没有了WebForm的便利性。那能不能实现服务器端可以任意的访问控件的属性,同时也不需要回发所有控件的属性呢?答案是可以,这就是我的大胆想法,可能有不足,也可能有局限性,所以需要大家积极提出。

这是现有的操作方式(来自FineUIMvc示例)
View中部分代码
  1. F.TextBox()
  2.                 .Label("用户名")
  3.                 .EmptyText("请输入用户名")
  4.                 .ID("tbxUserName")
  5.                 .Required(true)
  6.                 .ShowRedStar(true),
  7.             F.TextBox()
  8.                 .ID("tbxPassword")
  9.                 .Label("密码")
  10.                 .EmptyText("请输入密码")
  11.                 .TextMode(TextMode.Password)
  12.                 .Required(true)
  13.                 .ShowRedStar(true),
  14.             F.Button()
  15.                 .ID("btnSubmit")
  16.                 .CssClass("marginr")
  17.                 .OnClick(Url.Action("btnSubmit_Click"),
  18.                     new Parameter("userName", "F.ui.tbxUserName.getValue()"),
  19.                     new Parameter("password", "F.ui.tbxPassword.getValue()")
  20.                 )
  21.                 .ValidateForms("SimpleForm1")
  22.                 .Text("登录"),
  23.             F.Button()
  24.                 .ID("btnReset")
  25.                 .Text("重置")
  26.                 .OnClientClick("F.ui.SimpleForm1.reset();")
复制代码
Controller中的部分代码
  1. [HttpPost]
  2. [ValidateAntiForgeryToken]
  3. public ActionResult btnSubmit_Click(string userName, string password)
  4. {
  5.      UIHelper.Label("labResult").Text("用户名:" + userName + " 密码:" + password);
  6.      return UIHelper.Result();
  7. }
复制代码



而现在我们只需要这样做
View中部分代码,与之前相比只是去掉事件部分,事件放到TS中去写
  1. F.TextBox()
  2.                 .Label("用户名")
  3.                 .EmptyText("请输入用户名")
  4.                 .ID("tbxUserName")
  5.                 .Required(true)
  6.                 .ShowRedStar(true),
  7.             F.TextBox()
  8.                 .ID("tbxPassword")
  9.                 .Label("密码")
  10.                 .EmptyText("请输入密码")
  11.                 .TextMode(TextMode.Password)
  12.                 .Required(true)
  13.                 .ShowRedStar(true),
  14.             F.Button()
  15.                 .ID("btnSubmit")
  16.                 .CssClass("marginr")
  17.                 .ValidateForms("SimpleForm1")
  18.                 .Text("登录"),
  19.             F.Button()
  20.                 .ID("btnReset")
  21.                 .Text("重置")
  22.                 .OnClientClick("F.ui.SimpleForm1.reset();")
复制代码

Controller中部分代码
  1. [HttpPost]
  2. [ValidateAntiForgeryToken]
  3. public ActionResult btnSubmit_Click(string customParam)
  4. {
  5.      this.labResult.Text("用户名:" + this.tbxUserName.GetValue() + " 密码:" + this.tbxPassword.GetValue() + "自定义参数:" + customParam);
  6.      return UIHelper.Result();
  7. }
复制代码



当然你现在不能这样去做,GetValue()方法是一个扩展方法,还有很多类似这样扩展方法,扩展方法主要来源于客户端对象中的方法,GetValue()会从回发的数据中获取所对应控件的属性。

那客户端如何回发呢,这一部分也是最主要的。
1、解析Controller,并提取出所有的公共方法,同时解析出所有的方法参数
2、解析方法中所调用的预定义扩展方法,通过扩展方法获取所调用的对象,并获取对象的名称
3、通过方法中的参数名称及解析出来的对象名称在TS中构建一个类,用于客户端的数据回发


构建出的TS类(自动生成)
  1. export class btnSubmit_Click_Params {

  2.      public tbxUserName: string;
  3.      public tbxPassword: string;
  4.      public customParam: string;

  5.      constructor() {
  6.          this.tbxUserName = UI.tbxUserName.getValue();
  7.          this.tbxPassword = UI.tbxPassword.getValue();
  8.      }
  9. }
复制代码


客户端中的事件操作
  1. UI.btnSubmit.onClick(() => {
  2.     let params = new btnSubmit_Click_Params();
  3.     params.customParam = '自定义参数';

  4.     F.doPostBack('default/btnSubmit_Click', '', params);
  5. });
复制代码


整个过程除了Action的URL不是强类型,但这一块可以优化,其它全是强类型。

以上就是我的个数想法,可行性也得到的证实,只是不知道有没有局限性及不足,我想在着手去做之前,考虑的更全面一些,所以希望大家多提意见。

FineUIMvcTools插件事后的更新,将不在支持直接下载,而是通过回复并给出意见的才有可能获得。(记得留邮箱)


附上之前的相关帖子

离FineUIMvc可视化开发更进一步了
http://fineui.com/bbs/forum.php? ... d=9696&fromuid=5871


FineUI的TypeScript类型定义文件
http://fineui.com/bbs/forum.php? ... d=9616&fromuid=5871



发表于 2017-5-10 12:44:28 | 显示全部楼层
你的目的是做什么,技术研究吗?
 楼主| 发表于 2017-5-10 12:50:08 | 显示全部楼层
tomgy1987 发表于 2017-5-10 12:44
你的目的是做什么,技术研究吗?

目的是在FineUIMvc给我们带来轻便的同时,也能够像使用FineUI一样方便
发表于 2017-5-11 22:32:36 | 显示全部楼层
继续支持可视化操作,简便。
发表于 2017-5-12 10:45:36 | 显示全部楼层
牛人呀,但看不懂
发表于 2019-6-29 18:44:10 | 显示全部楼层
请问现在还在继续吗? 期待结果 634775870@qq.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-3-29 18:19 , Processed in 0.047018 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表