В ASP.Net MVC, как вы создаете виджеты, которые помещают javascript и css туда, куда они должны идти? - PullRequest
8 голосов
/ 16 ноября 2011

Я пытаюсь создать многоразовый виджет в ASP.Net MVC.Это виджет, который объединяет 2 даты в строку.Виджет содержит 3 файла: Widget.cshtml, Widget.css и Widget.js и зависимости от нескольких библиотек jquery.

Widget.cshtml

<h2>Create a date range</h2>

<div>
    <label for="startDate">Start:</label>
    <input id="startDate" class="date" name="startDate" type="text" />
</div>

<div>
    <label for="endDate">End:</label>
    <input id="endDate" class="date" name="endDate" type="text" />
</div>

<p id="output"></p>

<button id="createDateRange">Create</button>

Widget.css

label { color: #555;}

Widget.js

$(function () {
    $(".date").datepicker();

    $("#createDateRange").click(function () {
        var start = $("#startDate").val();
        var end = $("#endDate").val();
        $("#output").html(start + " to " + end);
    });
});

Я хочу сделать этот виджет многоразовым на моих страницах MVC.Я предложил несколько вариантов, в том числе:

  1. Создание помощника HTML
  2. RenderPartial
  3. RenderAction
  4. Удалите все зависимости css и javascript изфайл виджета.Скопируйте и вставьте вручную в каждое представление, которое я использую, в правильном месте.

Я собирался использовать помощника, когда вспомнил правила Стива Соудерса для производительности веб-сайта:

Правило 5: ставьте таблицы стилей вверху

Правило 6: ставьте скрипты внизу

Параметры 1), 2) и 3) все кажутся хорошими идеями, но все онинапишите код в строке и нарушите правила производительности.Вариант 4) позволяет вручную размещать файлы javascript и css, где они находятся, но копирование и вставка подвержены ошибкам.Потенциальной идеей было бы написать скаффолдер, который помещает все на свои места, но сейчас это кажется слишком большой работой.

Какой самый лучший (надеюсь простой) способ создания виджетов и при этом соблюдение правил производительности 5 &6

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Вы можете использовать RenderSection () , который похож на ContentPlaceHolder's old, и поместить их в ваш _Layout.cshtml

   <head>
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
   @RenderSection("head");
</head>

Тогда в вашем View ставится:

@{
    ViewBag.Title = "Home Page";
}
@section head
{
<link href="widget-style.css" type="text/css" rel="stylesheet" /><
}

<h2>@ViewBag.Message</h2>
<p>
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>

@section footer{
 <script type="text/javascript" src="wiget.js"></script>  
}

Это простая альтернатива, если вы не хотите использовать Combress или Chirpy, вам все равно придется добавить код на страницы, на которых вы используете элемент управления, но он появится в нужных местах.

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

2 голосов
/ 16 ноября 2011
  1. Измените ваш виджет, чтобы использовать ненавязчивые методы JavaScript, чтобы можно было сканировать весь DOM на наличие экземпляров вашего виджета.Полагайтесь на классы, а не на идентификаторы.
  2. Используйте инструмент, подобный Chirpy, чтобы упаковать все ваши CSS-файлы и файлы Javascript в один библиотечный файл (один .js и один .css), который вы можете добавить вверху и внизу(соответственно) вашей мастер-страницы / макета.
  3. Используйте HTML Helper для создания вашего виджета HTML.Если хотите, помощник HTML может визуализировать частичное представление, чтобы сохранить код представления HTML в файле представления.Поскольку вы используете ненавязчивый javascript, нет необходимости создавать какие-либо скрипты в строке.Просто позвольте JavaScript-коду виджета сканировать DOM на наличие экземпляров вашего виджета.

Шаг 1

В исходном примере уже используются некоторые ненавязчивые методы javascript, но вот как вы можете расширить этот шаблонБолее того, как показано в , это jsfiddle .

Widget.cshtml

<div class="date-range-widget">
    <h2>Create a date range</h2>

    <div>
        <label for="startDate">Start:</label>
        <input id="startDate" class="date start-date" name="startDate" type="text" />
    </div>

    <div>
        <label for="endDate">End:</label>
        <input id="endDate" class="date end-date" name="endDate" type="text" />
    </div>

    <p class="output"></p>

    <button class="create-date-range">Create</button>
</div>

Widget.js

$(function () {
    // This line could probably be done generally, regardless of whether you're
    // in the widget.
    $("input.date").datepicker();

    $("div.date-range-widget").each(function(){
        var $t = $(this);
        var startBox = $t.find("input.start-date");
        var endBox = $t.find("input.end-date");
        var output = $t.find("p.output");
        $t.find("button.create-date-range").click(function () {
            output.html(startBox.val() + " to " + endBox.val());
        });
    });    
});

Обратите внимание, как вы можете теперьиметь несколько экземпляров этого виджета, присутствующего на вашей странице, с различными значениями id и name, и они будут функционировать независимо друг от друга.

Когда отсутствует data-range-widget, javascript будетвсе еще ищите DOM, не можете найти и двигаться дальше.Однако стоимость этой операции обычно довольно незначительна по сравнению с выполнением отдельного обхода для другого файла javascript.Хранение CSS и javascript в отдельных статических файлах позволяет браузеру кэшировать эти файлы, что означает, что он в среднем передает меньше данных по проводам (поскольку только HTML изменяется от одного запроса к следующему).

Шаг 2

Я лично счел целесообразным объединить мой javascript и CSS в один файл, поэтому браузер должен извлечь только один javascript и один файл css для данной загрузки страницы (и оба будуткэшируется после загрузки первой страницы).Если у вас очень большой файл javascript, который используется только на определенных страницах, вы можете хранить его отдельно и загружать его только на определенных страницах.

Несмотря на это, ваш javascript должен быть написан таким образом, чтобы вы может загружать все файлы javascript на вашем сайте одновременно, не наступая друг другу на ноги.

Шаг 3

Должен быть довольно понятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...