将多行字符串变量从 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# 字符串编写 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 以创建换行符。