用c#中的图像替换文本

Sor*_*ora 1 c# asp.net

那是我的代码:

[WebMethod]
public static void SendChatMessage(string msg, int ToClient)
{
    if (msg != null && ToClient != 0)
    {
        if (msg.Contains(":-)")) msg.Replace(":-)", "<img src='Styles/emojie/smile.png'   />  ");
        else if (msg.Contains(":-(")) msg.Replace(":-(", "<img src='Styles/emojie/sad.png'   />  ");
        else if (msg.Contains(":'-(")) msg.Replace(":'-(", "<img src='Styles/emojie/cry.png'   />  ");
        else if (msg.Contains(":-$")) msg.Replace(":-$", "<img src='Styles/emojie/shy.png'   />  ");
        int FromClientID = Convert.ToInt32(HttpContext.Current.Session["ClientID"]);
        string query = "insert into chat (FROM_CLIENT,TO_CLIENT,CHAT_MSG) values (" + FromClientID + "," + ToClient + ",'" + msg + "')";
        new SQLHelper(SQLHelper.ConnectionStrings.WebSiteConnectionString).Insert(query);
    }
}
Run Code Online (Sandbox Code Playgroud)

msg被发送到数据库,因为它不是替换我做错了什么?

Jon*_*eet 9

您假设Replace修改了现有的*字符串.它没有.它返回一个新的字符串,并进行了修改.它必须,因为字符串在.NET中是不可变的.所有你的字符串操作可能会想到要改变字符串(Substring,ToUpper等)实际上返回一个新的.

所以你所有的电话都是这样的:

msg.Replace(...);
Run Code Online (Sandbox Code Playgroud)

应该是:

msg = msg.Replace(...);
Run Code Online (Sandbox Code Playgroud)

应该开始使用参数化SQL,而不是将所有值直接放入SQL查询中.这将使您的代码更具可读性,避免SQL注入攻击,并消除大量数据类型转换问题.

另外,我会在每个if语句上使用大括号,并将语句放在不同的行上:

if (msg.Contains(":-)"))
{
     msg = msg.Replace(":-)", "<img src='Styles/emojie/smile.png'   />  ");
}
Run Code Online (Sandbox Code Playgroud)

哦,现在你只让一个集替代的msg,由于if / else报表.:-(如果你已经更换了,你真的不想更换:-)吗?真的没有必要先进行Contains检查......我只是无条件地将呼叫链接在一起:

msg = msg.Replace(":-)", "<img src='Styles/emojie/smile.png'/> ")
         .Replace(":-(", "<img src='Styles/emojie/sad.png'/> ")
         .Replace(":'-(", "<img src='Styles/emojie/cry.png'/> ")
         .Replace(":-$", "<img src='Styles/emojie/shy.png'/> ");
Run Code Online (Sandbox Code Playgroud)

更简单.