将多行字符串变量从 C# 传递到 JavaScript

本文关键字:JavaScript 字符串 变量 | 更新日期: 2023-09-27 18:35:42

我有一个检查登录凭据的网页。该页面调用一个函数,该函数然后连接到 oracle 数据库中的表,并检查是否允许此用户查看应用程序。这一切都是使用 c# 完成的,但是如果数据库中出现致命错误,我想使用 javascript 通知用户。在我的 C# 代码中,我有一个字符串变量,它基本上会将 JavaScript 函数打印到网页中。它看起来像这样。

                    string javaScript =
                    "<script>"+
                    "var find = ':';"+
                    "var re = new RegExp(find, 'g');" +
                    "str='@"+CheckAccess[0]._ERROR.ToString().Replace(":"," ")+"';"+
                    "str = str.replace(re, '');"+
                    "if ($('#login_error').css('display') == 'none') {" +
                    "$('#login_error').text(str).show(); }" +
                    "else {Return;}</script>"; 

当数据库返回错误时,它会返回多行错误,如下所示。

  ORA-06550 line 1, column 7
PLS-00306 wrong number or types of arguments in call to 'GETUSERACCESS'
ORA-06550 line 1, column 7
PL/SQL Statement ignored at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)

我在网络上看到的所有示例都说用"/"将其分解,这样我就不会继续收到"未终止字符串文字"错误。但是,我没有看到有效的方法来做到这一点。是否有更好的方法来实现我想要完成的任务,或者我是否必须找到一种方法来解析此字符串并猜测换行符的位置。任何帮助将不胜感激。

谢谢米格尔

将多行字符串变量从 C# 传递到 JavaScript

我不建议尝试像现在这样做。像这样用 C# 字符串编写 JS 代码有点味道,例如,如果错误消息字符串不包含您期望的内容,则看起来可能会发生注入攻击。

与其在发生错误时尝试将 JS 代码传递给客户端,不如在页面中包含 JS 代码来处理错误,然后只传递包含错误字符串的 JSON 序列化数据结构。这应该允许多行字符串和其他特殊字符从服务器正确传递到客户端。

例如,如果你的类是这样的:

public class MyClass
{
    public bool Success { get; set; }
    public string ErrorMessage { get; set; }
}

然后,控制器方法可能如下所示:

public JsonResult TryToValidate(...)
{
    MyClass myClass = // result
    return Json(myClass);
}

登录页面上的伪 JS 如下所示:

MakeAjaxCallToTryToValidate(...)
.whenThatsDone(function ...() {
    if !result.Success
        alert(result.ErrorMessage);
});

或者,由于您不应该真正向普通用户公开错误详细信息,因此您可以将错误的详细信息记录在管理员可以查看的服务器上,并为用户提供一般错误消息。如果这是您可能期望用户执行的无效操作(例如输入错误的密码),则错误消息应该告诉他们,以及如何自己修复它,但"错误的数量或参数类型"错误通常不在该类别中。

您不必"猜测"换行符的位置。通常由一个或两个特殊转义字符表示:

  • 'r(CR = 回车),以及
  • 'n(NL = 换行符)。

(MS Windows通常使用CRLF,基于Unix的系统传统上只使用LF,但这可能会有所不同)。例如,您可以使用 CheckAccess[0]._ERROR.ToString().IndexOf("'r'n") 找到它们,并使用相同的技术替换它们。

由于您知道会将错误文本直接推送到 HTML 元素,因此您可以将'r'n (CRLF) 替换为<br/>(HTML 换行符)。

法典:

CheckAccess[0]._ERROR.ToString().Replace(":"," ").Replace("'r'n", "<br/>")

由于Oracle也可以在Unix机器上运行(例如),并且可能在错误消息中只返回LF而不是CRLF,因此您可能希望更加安全并且通用,首先尝试替换CRLF,然后替换CRLF,然后替换LF:

CheckAccess[0]._ERROR.ToString().Replace(":"," ") .Replace("'r'n", "<br/>") .Replace("'r", "<br/>") .Replace("'n", "<br/>")

然后,您的 javascript 将不会从 CRLF 注入空格,而是呈现 html 以创建换行符。