2015-07-02 7 views
1

Является ли следующий фрагмент хорошей практикой при использовании компонентов нокаута + Asp.Net MVC? Любые недостатки, которые я, возможно, не хватает?Зависимости от инъекции с компонентом нокаута через Razor

в основном инъекционные часть зависимостей компонентов кё (в основном начальные данные) с помощью Razor стороне сервера визуализации ...

Фрагмент кода:

<my-component params="{ 
    foo: '@Model.FooProperty', 
    bar: '@Model.BarProperty', 
    baz: @Json.Encode(@Model.SomeArray) 
}"> </my-component> 

EDIT:

Для избегая проблем с выводом строки, отмеченных @Quango, я внедрил этот помощник:

public static stringEscapeString(this HtmlHelper helper, string value) 
{ 
    return HttpUtility.JavaScriptStringEncode(value, true); 
} 

Использование:

<my-component params="{ 
     foo: '@Html.EscapeString(Model.FooString)', ... 
+1

Я был бы осторожен в отношении ввода значений строк без механизма эвакуации. если 'Model.FooProperty =" O'Brien "' вы получите ошибку рендеринга. Кроме этого, единственным способом было бы использовать значения viewModel, которые могут быть неприемлемыми (если значение не изменяется) – Quango

+0

@Quango: Что вы подразумеваете под значениями viewModel? – Daniel

+0

Нокаут может связывать значения в разделе «params» с литеральными значениями (как в вашем примере) или с наблюдаемыми значениями в режиме просмотра нокаута, если он присутствует. Таким образом, foo, переданный компоненту, будет наблюдаемым значением, и компонент может увидеть изменения. Примеры на страницах моих скриптов, например. https://jsfiddle.net/Quango/tnphvvgd/ – Quango

ответ

0

Мы используем Нокаут в проекте ASP.NET MVC на мою работу, и делать это считают плохой практикой. Но причины этого могут не относиться к вам. Это то, что вы должны будете судить сами

  • Нет кэширования HTML (поскольку введенные значения могут измениться)
  • Нет пакетирования вашего HTML с вашим JavaScript (как указано выше)
  • смешивания различных решения для одной и той же проблемы могут быть плохой практикой, особенно в (больших) командах. По сути, вы выбрали Knockout, поэтому «обычной» практикой было бы получение любых данных, которые вам нужны в JavaScript, и привязка к ним в вашем представлении. Если это то, что вы обычно делаете, подумайте, действительно ли вы хотите создать исключение, просто потому, что данные (предположительно) статичны. Если это все о сохранении нескольких байтов, то просто представьте себе, как это сбалансировать, чтобы обслуживать ВСЕ ваши HTML и JavaScript в мини-пакете, который также можно кэшировать на клиенте.
  • Невозможно переопределить данные позже, по сути, он «жестко закодирован» сервером.
  • Ваш код становится менее переносимым. Синтаксис Razor существенно связывает ваш интерфейс с выбранными вами бэкэнд-технологиями. Если это долгосрочный проект, подумайте, может ли быть небольшая вероятность, что через пару лет вы можете решить, какая другая бэкэнд-технология может быть лучшей альтернативой, и если действительно имеет смысл, что вам придется переписать половину интерфейс, чтобы сделать это возможным.

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

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

  • Нет связанных вопросов^_^