在写一个父子页面交互的事件时遇到了一个问题,环境是FineUICore
,子页面用window
的IFrame
,在window执行保存后,需要执行父页面的赋值方法;
比如 F.ui.tbxProvince.setValue('结果');
,这里直接写的js,其实在后台是 UIHelper.TextBox("tbxProvince").Text(province);
这两个效果是一样的
但是在子页面直接执行 F.ui.tbxProvince
是找不到😕的,子页面没这个控件,所以要在父页面调用,可以这样写
javascriptF.getActiveWindow().window.F.ui.tbxProvince.setValue('结果');
F.getActiveWindow().window
就是激活这个窗口的window对象,
在后台我将 F.ui.tbxProvince.setValue('结果');
封装为一个方法,比如 SetText
c#public async Task SetText(string value)
{
var script = $"F.ui['tbxProvince'].setText('{value}');";
PageContext.RegisterStartupScript(script);
}
如果加上 F.getActiveWindow().window
就要重写📝 ,或给 SetText
增加参数,比如👇
c#public async Task WindowSetText(string value)
{
var script = $"F.getActiveWindow().window.F.ui['tbxProvince'].setText('{value}');";
PageContext.RegisterStartupScript(script);
}
在调用时,
c#[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Window1_Close()
{
await WindowSetText('结果');
return UIHelper.Result();
}
这里我认为 SetText
和 WindowSetText
是干的一件事:setText
,只不过作用域(作用域这个词可能不准确)不一样,同一件事写两个地方,维护是不方便的;同样如果给 SetText
增加一个参数来定义作用域也不好,这个样SetText
对外也是破坏性的
既然作用域不一样,那我就声明一个作用域
,让SetText
判断当前在哪个作用域
下,从而执行不一样的行为;
比如我想写成这样👇
c#[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Window1_Close()
{
//告诉内部的代码生成js时应该加上 F.getActiveWindow().window.
await ActiveWindow(async () =>
{
SetText(province);
});
return UIHelper.Result();
}
SetText
中如何得到 ActiveWindow
从而判断呢,这个我倒是经常用✅ 直接让GPT优化了下
c#public bool IsMethodActiveWindowCalledInCallStack()
{
StackTrace stackTrace = new StackTrace();
StackFrame[] stackFrames = stackTrace.GetFrames();
//这里要遍历向上找,因为异步
return stackFrames?.Any(frame => frame.GetMethod()?.Name.Contains("ActiveWindow") ?? false) ?? false;
}
SetText
写成这样
c# public async Task SetText(string value)
{
var top = IsMethodActiveWindowCalledInCallStack() ? "F.getActiveWindow().window." : "";
var script = $"{top}F.ui['tbxProvince'].setText('{value}');";
PageContext.RegisterStartupScript(script);
}
这里是一个例子,实际上不是为了写个简单的✨SetText
,而是为了写方法提供的一个思路🧠,
简单的GetFrames
也会消耗性能,在FineUI中父子页面交互 通过 ActiveWindow.GetWriteBackValueReference
和 PageContext.RegisterStartupScript
配合使用,
像输出的js增加一个头 F.getActiveWindow().window.
的这种例子 应该写到 PageContext.RegisterStartupScript
中 或更底层🔨,
本文作者:没想好
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!