在做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")))
还有一个改动是,我习惯页面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
已经完全是我的形状了 🙈
---清蒸鲈鱼要用新鲜的海鱼,搭配姜葱提鲜🍽️---
框架还有一个改动,对于一个耗时加载我希望先返回前台,然后后台另一个线程计算,完成后前台再响应;对于平时开发可能不是很必要,但是有个操作频繁的超时,而且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();
}
提示
未完待续
本文作者:没想好
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!