Кавычка Escape в C# для потребления JavaScript

Вы должны реструктурировать свои маршруты, чтобы зона и деревня стали параметрами маршрута.

Так, например, маршрут для http: // localhost: 8000 / estates / London / villa будет Route::post('/estates/{zone}/{villa}', 'SomeController@action'), и в контроллере вы можете ввести зону и село в качестве параметров. Таким образом, вы можете использовать что-то вроде этого:

class SomeController {
         public function action(Request $request, string $zone, string $villa){

         }
}

Это описано далее в разделе Параметры маршрута в Routing in Laravel docs.

61
задан Jeff Atwood 29 August 2009 в 10:14
поделиться

6 ответов

Почему бы вам просто не сделать это:

string correctResponseText = wrongResponseText.Replace("\"", "\\\"");
0
ответ дан 24 November 2019 в 16:58
поделиться

Чтобы правильно экранировать строковый литерал для Javascript, вы сначала экранируете все символы обратной косой черты, а затем экранируете кавычки (или апострофы, если вы их используете). как разделители строк).

Итак, что вам нужно:

value.Replace("\\","\\\\").Replace("\"","\\\"")

Что еще мне бросается в глаза, это то, что вы используете конкатенацию строк в цикле. Это плохо, так как очень плохо масштабируется. Оператор + = не добавляет символы в конец существующей строки (поскольку строки являются неизменяемыми и никогда не могут быть изменены), вместо этого он копирует строку и добавленные символы в новую строку. Поскольку вы копируете все больше и больше данных каждый раз, дополнительная строка eEvery примерно удваивает время выполнения метода. Вместо этого используйте StringBuilder для построения строки.

Используйте свойство ColumnName , чтобы получить имя столбца, а не метод ToString . Метод ToString возвращает значение свойства Expression , если оно установлено, только если оно не установлено, оно возвращает свойство ColumnName .

public static String dt2JSON(DataTable dt) {
   StringBuilder s = new StringBuilder("{\"rows\":[");
   bool firstLine = true;
   foreach (DataRow dr in dt.Rows) {
      if (firstLine) {
         firstLine = false;
      } else {
         s.Append(',');
      }
      s.Append('{');
      for (int i = 0; i < dr.Table.Columns.Count; i++) {
         if (i > 0) {
            s.Append(',');
         }
         string name = dt.Columns[i].ColumnName;
         string value = dr[i].ToString();
         s.Append('"')
            .Append(name.Replace("\\","\\\\").Replace("\"","\\\""))
            .Append("\":\"")
            .Append(value.Replace("\\","\\\\").Replace("\"","\\\""))
            .Append('"');
      }
      s.Append("}");
   }
   s.Append("]}");
   return s.ToString();
}
5
ответ дан 24 November 2019 в 16:58
поделиться
string.Replace(<mystring>, @"\"", @"\\"");
0
ответ дан 24 November 2019 в 16:58
поделиться

Ну, для начала вам не нужны кавычки вокруг клавиш.

{rows:[,]} is valid.

and you could dt.Table.Columns[i].ToString().Replace("\","")

Но если вы хотите сохранить двойные кавычки, одинарные кавычки работают так же, как двойные кавычки в JS

В противном случае вы могли бы сделать

String.Format("{name: \"{0}\"}",Columns[i].ToString().Replace("\",""))
-1
ответ дан 24 November 2019 в 16:58
поделиться

Вот эффективный и надежный метод, который я нашел на http://www.west-wind.com/weblog/posts/114530.aspx

/// <summary>
/// Encodes a string to be represented as a string literal. The format
/// is essentially a JSON string.
/// 
/// The string returned includes outer quotes 
/// Example Output: "Hello \"Rick\"!\r\nRock on"
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string EncodeJsString(string s)
{
    StringBuilder sb = new StringBuilder();
    sb.Append("\"");
    foreach (char c in s)
    {
        switch (c)
        {
            case '\"':
                sb.Append("\\\"");
                break;
            case '\\':
                sb.Append("\\\\");
                break;
            case '\b':
                sb.Append("\\b");
                break;
            case '\f':
                sb.Append("\\f");
                break;
            case '\n':
                sb.Append("\\n");
                break;
            case '\r':
                sb.Append("\\r");
                break;
            case '\t':
                sb.Append("\\t");
                break;
            default:
                int i = (int)c;
                if (i < 32 || i > 127)
                {
                    sb.AppendFormat("\\u{0:X04}", i);
                }
                else
                {
                    sb.Append(c);
                }
                break;
        }
    }
    sb.Append("\"");

    return sb.ToString();
}
34
ответ дан 24 November 2019 в 16:58
поделиться

Я думаю, вам лучше взглянуть на класс JavaScriptSerializer. Он намного более стабилен и будет правильно обрабатывать любые данные, escape-символы и т. Д. Кроме того, ваш код будет выглядеть намного чище.

В вашем случае ваш класс может выглядеть так:

public static String dt2JSON(DataTable dt) {
    var rows = new List<Object>();
    foreach(DataRow row in dt.Rows)
    {
        var rowData = new Dictionary<string, object>();
        foreach(DataColumn col in dt.Columns)
            rowData[col.ColumnName] = row[col];
        rows.Add(rowData);
    }
    var js = new JavaScriptSerializer();
    return js.Serialize(new { rows = rows });
}

Этот метод вернет правильно сериализованную строку json ... Например, sth как это:

{"rows":[{"id":1,"name":"hello"},{"id":2,"name":"bye"}]}

Удачи! :)

11
ответ дан 24 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: