.net - 使用 CefSharp 从 JavaScript 调用 C# 是否有一种不那么痛苦的方法?
问题描述
我使用 CefSharp 作为我的 .Net 桌面应用程序的 UI,但这部分让我有些头疼,例如功能:
这是我期望做的:
public Sales ProcessSale(Sales sale) {
sale.Shift = terminal.CurrentShift;
sale.SalesPerson = terminal.CurrentUser;
var errors = sale.ValidateInput();
if (errors.Count > 0) {
throw new BusinessValidationException(errors);
}
terminal.CreateIdentity(sale);
worker.FireAndForget(() => {
SafeStorage.Put(sale);
});
return sale;
}
然后在 JS 端:
try {
let processedSale = await window['sales'].ProcessSale(this.saleModel);
// ... call print receipt and carry on
} catch(err) {
this.modalsService.alert(err.Message);
}
干净整洁;
但是,它不起作用。CefSharp 将对象参数作为 ExpandoObjects 传递,并且 javascript 中引发的错误是 C# 异常的完整堆栈跟踪打印,这两种处理方法都很难使用。
这是有效的,我讨厌这样做:
public string ProcessSale(string sale) {
try {
return JsonConvert.SerializeObject(
ProcessSale(
JsonConvert.DerializeObject<Sales>(sale)
)
);
} catch(Exception x) {
return JsonConvert.SerializeObject(x);
}
}
public Sales ProcessSale(Sales sale) {
sale.Shift = terminal.CurrentShift;
sale.SalesPerson = terminal.CurrentUser;
var errors = sale.ValidateInput();
if (errors.Count > 0) {
throw new BusinessValidationException(errors);
}
terminal.CreateIdentity(sale);
worker.FireAndForget(() => {
SafeStorage.Put(sale);
});
return sale;
}
接着:
async otherwiseUnnecessaryProcessSaleWrapper(saleModel) {
const modelJson = JSON.stringify(saleModel);
const retvJson = await window['sales'].ProcessSale(modelJson);
const retv = JSON.parse(retvJson);
if(retv.ClassName || retv.StackTrace) {
throw retv;
} else {
return retv;
}
}
. . .
// and only then:
try {
let processedSale = await otherwiseUnnecessaryProcessSaleWrapper(this.saleModel);
// ... call print receipt and carry on
} catch(err) {
this.modalsService.alert(err.Message);
}
有没有办法避免这种 MASSIVE 不必要的冗长,创建一个自定义的 javascript 互操作处理程序或其他东西,我提前感谢。
解决方案
推荐阅读
- c# - 请求在 IIS 上停留在 BeginRequest 状态
- java - Grizzly 2.4 Embedded Https Server 在 NEED_WRAP 上无限循环
- javascript - 如何在 GEE 中使用 shapefile 资产作为 AOI?
- c# - 无法修复 SonarCloud 上的 SQL 注入
- reactjs - 删除行时更新单元格背景颜色。(反应表)
- c# - 无法使用 C# 的 selenium Web 驱动程序根据标签名称选择元素
- javascript - 如何以天、小时和分钟显示下一个生日倒计时?
- haskell - Haskell 中真正的非确定性
- python-3.x - 将相似键的字典转换为字典列表(更新)
- java - 如何在 Java 中为 Koin 获取 Android 上下文