编辑
2024-11-07
我当开发
00

目录

1. ready回发
2. FAsyncTask

在做Q3的总结,这里记录下代码部分

Q3中框架升级的点包括之前提到的基于SignalR的及时响应,已经适配了多个控件的多个属性方法,对于常用的方法代码变得非常简介,前台不用写自定义的回发提交

c#
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> LoadList2Data() { var MA003 = await FineUIAjaxHelpEx.QueryString("MA003"); var list = await bLLORAC1.GetListBy10(MA003); await Grid1.DataBindAsync(list, showloading: true); return ResultAsync(); }
cshtml
.Tools(F.Tool().IconFont(IconFont._Refresh).OnClickAsync(Url.Action("LoadList2Data")))

1. ready回发

还有一个改动是,我习惯页面rend后加载Grid数据,而不是在 视图return view绑定数据,因为LoadList2Data方法可能被调用多次,初始化时又不能使用 FineUI.UIHelper 只能用ViewBag😑,所以干脆每次都在 F.ready 进行一次回发,这样前台必要的页面已经绘制了,然后再加载数据,但是F.ready 我也懒的写了😪,所以打开视图的代码改成了这样

修改前

c#
public async Task<IActionResult> C1List() { await InitPage(); return View(); } //前台 F.ready 回发 ... [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> LodeGrid() { await Grid1.ShowLoading(); ... }

修改后

c#
public async Task<IActionResult> ListView3() { await InitPage(); return await FView(LodeGrid, loading: true); }

原理就是 IActionResult 时告诉前台 有个方法 LodeGrid 等着执行呢,你F.ready后回发一次,执行LodeGrid代码。完全是基于缓存的,这里放出源码以供参考

c#
/// <summary> /// 注册异步任务到缓存,会在FPageReady后执行 /// </summary> /// <param name="value">任务</param> /// <param name="seconds">超时时间</param> /// <returns></returns> public async Task<IActionResult> FView(Func<Task> value, int seconds = 30, bool loading = false, int wait = 10) { var taskId = Guid.NewGuid().ToString(); var cache = HD.Commons.PageContext.GetServerByApp<ICache>(); cache.Set(taskId, value, seconds); var Script = "F.ready(function () {setTimeout(()=>F.doPostBackP({url: window.pburl+ '/FPageReady',params:{taskId:'" + taskId + "'},enableAjaxLoading: " + loading.ToString().ToLower() + ",})," + wait + ");});"; FineUICore.PageContext.RegisterStartupScript(Script); return View(); } /// <summary> /// 在FPageReady后执行 /// </summary> /// <param name="taskId">任务ID</param> /// <returns></returns> [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> FPageReady(string taskId) { var cache = HD.Commons.PageContext.GetServerByApp<ICache>(); if (taskId != null && cache.Exists(taskId)) { var taskValue = cache.Get<Func<Task>>(taskId); if (taskValue != null) { await taskValue(); } cache.Remove(taskId); } return ResultAsync(); }

Controller已经完全是我的形状了 🙈

---清蒸鲈鱼要用新鲜的海鱼,搭配姜葱提鲜🍽️---

2. FAsyncTask

框架还有一个改动,对于一个耗时加载我希望先返回前台,然后后台另一个线程计算,完成后前台再响应;对于平时开发可能不是很必要,但是有个操作频繁的超时,而且SignalR就在那放着,不用白不用。

如果实现要解决的问题比较多🤔,比如由于提前处理完回发,上下文没有了,新的线程再操作列表绑定时,并不知道是哪个页面的列表。而且有一个绕不过去的问题,有好思路的可以告诉我一下:只要用Task.Run上下文肯定丢失😕,再对FineUI控件进行操作就报错了💢。

这里只用了临时的解决方案,还在验证 FAsyncTask 方法的必要性,但是方法还是可用的

c#
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> LodeGrid() { var Grid1 = "Grid1".ToFGrid(); await Grid1.ShowLoading(); await FAsyncTask(async ui => { var data = await bLLORACOPMA.GetData(msq); await Grid1.DataBindAsync(data, showloading: true); await ui(" console.log('加载完了>');"); }); return ResultAsync(); }

提示

未完待续

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:没想好

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!