2015-05-06 2 views
0

Я пытаюсь передать структуру объекта в свой html, связать с href. Проблема становится файловым путем (путь к .exe) не понят из-за «\».KnockoutJS mapping.fromJSON борется с обратными косыми чертами (значениями пути к файлу)

пример ниже:

var categories = ko.mapping.fromJSON('[{"Applications":[{"Documentation":null,"ApplicationId":2,"Name":"PSSE","Description":"Model software","LocalExePath":"aecies://runApp?C:\Program Files (x86)\MyApp\app.exe"}],"Name":"foobar"}]'); 

Извините, если я испортил некоторый синтаксис, я принимал гораздо больший объект JSON и сжатие для примера, возможно, пропустил скобку где-нибудь. В любом случае, что выйдет в категориях для ExePath, в приведенном выше случае, это строка с удалением '\. Если я заставляю его «\\» для каждого «\», он терпит неудачу, говоря, что не понимает идентификатор P (явно нарушение в C: \ Program).

Ответ Мартина, кажется, является тем, что я хочу, но то, что я поставил в вопрос, было то, что мне нужно для JSON. Проблема в том, что мой код на самом деле не похож. Вот что выплевывается из @ Html.Raw(). Ниже я добавил свой фактический код. Проблема в том, что я не могу просто добавить другую, заменив все \ на четыре, потому что она добавляет \ к каждому заголовку JSON. (В конце концов выглядит как [{\\\\ «Applications») \\\\

var categories = ko.mapping.fromJSON(
     '@Html.Raw(JsonConvert.SerializeObject(Model.Categories, 
        Formatting.None, 
        new JsonSerializerSettings { StringEscapeHandling = StringEscapeHandling.EscapeHtml, ReferenceLoopHandling = ReferenceLoopHandling.Ignore} 
           ).Replace("\\u0022", "\\\"").Replace("\"", "\\\""))'); 

Два возможного исправления я использовал это String.Replace в контроллере для форматирования данных там. Или иметь две слэши для каждой записи в моей базе данных. После того, как он проходит сериализацию и Html.Raw, он заканчивается правильной 4-мя суммами, если в базе данных 2. Есть ли третий вариант, который позволил бы мне сохранить фактическую строку пути (без дополнительной косой черты, C: \ HelloDir \) в базе данных, но добавьте строку в мой код Razor, чтобы заменить косые черты, которые меня волнуют.

Редактировать: stackoverflow не понравилось, что я делаю двойные слэши, что идеально, потому что есть большая часть моей проблемы с отображением.

Edit2: Существует еще вопрос

ответ

0

Для тех, кто ищет решения проблемы слэш, я понял, что ясно, что EscapeHtml запись выдува вещи. Если я удалю это, а затем обработаю специальные специальные символы, которые я хочу экранировать с помощью операторов Replace, все работает отлично.

var categories = ko.mapping.fromJSON(
     '@Html.Raw(JsonConvert.SerializeObject(Model.Categories, 
        Formatting.None, 
        new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore} 
           ).Replace(@"\r\n", "").Replace(@"'", @"\'").Replace(@"/", @"\/").Replace(@"\\", @"\\\\").Replace("\"", "\\\""))'); 
0

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

  1. строка JavaScript буквальные (витки \\ к \)
  2. JSON декодирования (витки \\ к \)

Так вы хотите:

var categories = ko.mapping.fromJSON('[{"Applications": [{"Documentation":null,"ApplicationId":2,"Name":"PSSE","Description":"Model software","LocalExePath":"aecies://runApp?C:\\\\Program Files (x86)\\\\MyApp\\\\app.exe"}],"Name":"foobar"}]'); 

вы можете увидеть еще несколько примеров на http://jsfiddle.net/gjb4h0jy/2/

Смежные вопросы