首页 > 解决方案 > 使用 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 互操作处理程序或其他东西,我提前感谢。

标签: .netcefsharp

解决方案


推荐阅读