Управление CSS, Javascript и их соглашениями об именах в MVC 3 - PullRequest
1 голос
/ 08 июля 2011

В последнее время я строю проект, опирающийся на javascript / jquery.Когда некоторые из частичных представлений визуализируются, им необходимо применить некоторые JavaScript-стили или CSS-стили.Есть ли у вас какие-либо идеи относительно эффективного управления этими файлами?

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Управление файлами CSS, файлами JavaScript и почти любым другим файлом зависит от ваших избранных категорий или, другими словами, таксономии . Я думаю, что лучший вопрос заключается в том, каким руководствам я должен следовать, чтобы мой проект стал более успешным. Например, несмотря на то, что вы управляете и классифицируете свои файлы JavaScript, постарайтесь, чтобы их не было на странице, так как каждый из них делает отдельный HTTP-запрос к серверу. Или постарайтесь быть максимально последовательными в именовании, чтобы в будущем ваш код не озадачил вас. Для CSS и JavaScript я предлагаю LDSW .

1 голос
/ 09 июля 2011

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

В итоге я создал контроллер для агрегированияфайлы на сервере для меня, а затем отправить только один файл css \ js в браузер.Ответ, возможно, более сложный, чем вы запрашивали, поэтому я рекомендую первую часть.

Вы можете создать метод расширения, который можно вызывать вверху каждой страницы, чтобы добавить файл JS в список.в словаре TempData для запроса.Затем вы вызываете отдельный метод из макета, который будет отображать любые дополнительные ссылки.

Это работает, потому что TempData сохраняется только для запроса, а представление макета отображается последним (после запуска всех представлений и частичных операций).

У меня есть полный пример класса: http://pastebin.com/EUC2fAca, но я также формирую ссылки на мой агрегатор, поэтому вам нужно будет изменить.Суть заключается в следующем:

public static string JSKey = "pageJSList";      

private static void AddToDictionary(HtmlHelper helper, string[] files, string key)
{
    if (files == null || files.Length == 0)
        return;

    TempDataDictionary dict = helper.ViewContext.TempData;
    if (!dict.ContainsKey(key))
        dict.Add(key, new List<string>());

    (dict[key] as List<string>).AddRange(files);
}

private static void InsertToDictionary(HtmlHelper helper, string[] files, string key)
{
    if (files == null || files.Length == 0)
        return;

    TempDataDictionary dict = helper.ViewContext.TempData;
    if (!dict.ContainsKey(key))
        dict.Add(key, new List<string>());

    (dict[key] as List<string>).InsertRange(0, files);
}       

public static void AddJS(this HtmlHelper helper, params string[] files)
{
    AddToDictionary(helper, files, JSKey);
}

public static void AddJSToTop(this HtmlHelper helper, params string[] files)
{
    InsertToDictionary(helper, files, JSKey);
}

public static MvcHtmlString GetJsTagHtml(HtmlHelper helper)
{
    var files = helper.ViewContext.TempData[JSKey] as List<string>;
    StringBuilder tags = new StringBuilder();
    string jsTemplate = "<script type=\"text/javascript\" src=\"/Scripts/{0}\"></script>";

    foreach (string file in files)
    {
        tags.AppendLine(String.Format(jsTemplate, file));
    }

    return MvcHtmlString.Create(tags.ToString());   
}

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

Ваш метод GetJS, вероятно, должен возвращать MvcHtmlString, которая содержит все нужные вам теги.

Надеюсь, что это поможет и не слишком затянуто =)

...