Вы пишете свой JavaScript в представлении ASP.NET MVC... или в отдельном файле JavaScript?
Попытка улучшить мои стили кодирования Я пробовал разные решения, но я не могу понять, что лучше.
Я начал использовать JavaScript внутри своих представлений, но мне это не особенно нравится.
Трудно отладить с помощью Visual Studio, и это виды "загрязняет" страницу.
Моя новая "тенденция" заключается в том, чтобы поместить скрипты для страницы в отдельный файл.
Единственная проблема, с которой я столкнулся, - это код.
Чтобы решить проблему, я определил переменные JavaScript следующим образом:
<script type="text/javascript">
var PriceListFetchAction = '<%=Url.Action("Fetch", "PriceList")%>';
var UploaderAction = '<%=Url.Action("UploadExcelPriceList", "PriceList")%>';
var ModelId = '<%=Model.id%>';
var ImportType = '<%=Model.Type%>';
var customerCodeFetchAction = '<%=Url.Action("FetchByCustomerCode", "Customers")%>';
var customerNameFetchAction = '<%=Url.Action("FetchByCustomerName", "Customers")%>';
var ImportErpAction = '<%=Url.Action("ImportPriceListErp", "PriceList")%>';
var imageCalendar = '<%=Url.Content("~/Content/Images/calendar.png")%>';
</script>
а затем я использую переменные в моем файле JavaScript.
Что является лучшим с точки зрения производительности, отладки, стиля для вас?
Ответы
Ответ 1
Я следую нескольким правилам:
- Не присоединяйте переменную непосредственно к DOM, если это абсолютно необходимо.
- Поместите как можно больше информации в js файлы. Чем меньше js файлов, тем лучше.
- Верните свои js файлы. При публикации, минимизации и смятии через Chirpy или SquishIt
- В js минимизируйте зависимость от динамических значений на стороне сервера (сгенерированные идентификаторы и т.д.), когда сможете.
Итак, вот пример:
Я добавлю метаданные jQuery и jQuery в свой проект:
http://plugins.jquery.com/project/metadata
Затем, в моем основном файле js, я буду расширять jQuery своим собственным пространством имен:
$.extend({
fatDish : {
url : {},
urls : function(a) {
$.extend($.fatDish.url, a);
}
}
});
Почти вся моя настраиваемая js-логика будет жить в пространстве имен $. fatDish.
Теперь, скажем, я хочу передать маршрут MVC на $. fatDish. На моей странице aspx я бы написал следующее:
<script src="@Url.Content("~/path/master.js")" type="text/javascript"></script>
<script type="text/javascript">
$.fatDish.urls({
path1 : '@Url.Action("Index", "Home")'
});
</script>
В js файле я могу теперь написать:
window.location = $.fatDish.url.path1;
Второй подход заключается в использовании метаданных jQuery (о чем я упоминал выше). На странице aspx вы можете написать что-то вроде:
<div class="faux-link {act:'@Url.Action("Index", "Home")'}">Go Somewhere</div>
Затем в вашем js файле вы можете получить значение маршрута следующим образом:
$('.faux-link').click(function() {
var $this = $(this);
var href = $this.metadata().act;
window.location = href;
});
Ответ 2
Я создаю отдельные javascripts для вычислений/логики, но вызываю их из своего представления. Таким образом, мне не нужно создавать глобальные переменные и проще использовать javascripts.
Пример javascript:
function doSomeCoolProcessing(modelId, fetchAction)
{
//some stuff
}
и в представлении
<script type="text/javascript">
$('document').ready(function() {
doSomeCoolProcessing('<%=Model.id%>', '<%=Url.Action("Fetch", "PriceList")%>');
)};
</script>
Это также значительно облегчает то, что происходит (и отлаживается, когда вы возвращаетесь в свой проект через шесть месяцев), поскольку ничего не происходит, если вы явно не говорите ему об этом.
Ответ 3
Лично я всегда помещаю javascript в отдельные файлы. Глобальные переменные, которые зависят от маршрутизации или некоторой информации на стороне сервера внутри представления. Точно так же, как и вы. В качестве альтернативы хранению глобальных переменных вы можете использовать элементы привязки или формы, которые уже содержат URL-адрес, а затем ajaxify. Что касается значений модели, они могут храниться также в элементах DOM, таких как скрытые поля, классы CSS, атрибуты данных HTML5,..., но это может быть неприменимо ко всем ситуациям.
Ответ 4
vandalo,
Я занял ситуацию, когда javascript находится в отдельном файле. однако, используя результат пользовательского действия на контроллере, js вызывается как функция htmlhelper и имеет контекст со страницей. htmlhelper фактически выполняет код как файл и поэтому кэшируется, тем самым ускоряя выполнение/доставку.
Я знаю, вам будет интересно посмотреть, как это работает, так что обновите ответ, чтобы показать механику этого чуть позже.
til then... (здесь ссылка на то, где я получил свое вдохновение, а затем подстроил это для своих нужд)
Маршрутизация и пути ASP.NET MVC - это файлы js
ok, здесь мой обработанный пример (простой проект mvc 2, содержащий необходимые помощники и классы) - наслаждайтесь:
http://www.gatehousemusic.com/downloads/ServeJsExample.zip
Ответ 5
Отдельный файл для аккуратности как минимум. Чем меньше языков вы помещаете в каждый файл, тем легче будет читать, что он делает с первого взгляда.
Ответ 6
Здесь мои методы в ASP.NET MVC3 для завершения ответа @weirdlover, одна вещь, которую он пропустил, - это кодировка JSON, которая очень важна, когда вы хотите безопасно вводить данные в js.
Если данные не слишком большие и могут быть логически привязаны к элементу DOM, я использую один (или несколько) атрибут данных (не требуйте плагина jQuery и не оставляйте класс css) и класс css найти элементы из jQuery.
Глупый пример:
HTML:
<div class="text-widget"
data-options="@Json.Encode(new { url = Url.Action("Update", "Text", new { id = 3 }), uselessParam = true })">
<input type="text" />
</div>
CoffeeScript:
class TextWidget
constructor: (@element) ->
@el = $ @element
@options = @el.data 'options'
@input = @el.find 'input'
@input.change @update
update: =>
value = @input.val()
$.post @options.url,
value: value
, -> alert 'text saved'
$ ->
new TextWidget element for element in $('.text-widget').get()
Немного gotcha с Json.Encode и jQuery.data:
если вы используете его на простой строке, вы получите строку с кавычками в javascript: $(). data ('strattribute') == '' hello "'. Просто используйте Html.Encode в этом случае.
В любом случае я предпочитаю использовать один элемент с анонимным объектом, который я создаю в контроллере, его легче поддерживать: data-options="@Json.Encode(Model.Options)"
.
Если есть много данных, например список объектов, я перейду к ViewModels для knockoutjs, я использую <script>
и var data = @(Html.Raw(Json.Encode(Model.MyData)));
.
Я также использую namespacing и closures, чтобы избежать обхода глобального объекта.