Вы должны реструктурировать свои маршруты, чтобы зона и деревня стали параметрами маршрута.
Так, например, маршрут для 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.
Почему бы вам просто не сделать это:
string correctResponseText = wrongResponseText.Replace("\"", "\\\"");
Чтобы правильно экранировать строковый литерал для 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();
}
Ну, для начала вам не нужны кавычки вокруг клавиш.
{rows:[,]} is valid.
and you could dt.Table.Columns[i].ToString().Replace("\","")
Но если вы хотите сохранить двойные кавычки, одинарные кавычки работают так же, как двойные кавычки в JS
В противном случае вы могли бы сделать
String.Format("{name: \"{0}\"}",Columns[i].ToString().Replace("\",""))
Вот эффективный и надежный метод, который я нашел на 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();
}
Я думаю, вам лучше взглянуть на класс 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"}]}
Удачи! :)