MVC + RegisterClientScriptInclude / RegisterClientScriptBlock - PullRequest
4 голосов
/ 12 ноября 2009

Есть ли MVC-эквивалент, эквивалентный Page.ClientScripts.RegisterClientScriptInclude и Page.ClientScripts.RegisterClientScriptBlock?

Я пытаюсь создать частичные представления, на которые вполне можно ссылаться несколько раз из одного и того же основного вида.

Эти представления вполне могут иметь свои собственные требования к сценариям, но, по-видимому, расточительно писать включения на каждом потенциальном главном представлении или главной странице.

Также я чувствую, что было бы целесообразно, чтобы частичное представление вызывало какой-то javascript один раз, чтобы инициализировать все его родственные представления.

Например ...

$('input[alt=date]').datepicker();

... это то, что мне действительно нужно вызывать только один раз, но только если частичное представление поместило такой элемент управления hmtl в представление.

Так что любые идеи о том, как мне достичь старых функций Page.ClientScripts.RegisterClientScriptInclude и Page.ClientScripts.RegisterClientScriptBlock в ASP.Net MVC Framework

Ответы [ 3 ]

4 голосов
/ 03 сентября 2010

Вы можете использовать Spark View Engine, который имеет атрибут «один раз» для этой цели. Э.Г.

<content name="MasterPageHead">
  <script once="CustomScriptUniqueIdName" ... />
</content>

При использовании в представлении или в части сценарий (или это может быть любой другой тег, например, div) будет включен только один раз в раздел главной страницы под названием MasterPageHead (который можно поместить в ).

Не уверен, будет ли это полезно для вас, но вы запросили решение MVC, а не решение WebForms.

3 голосов
/ 12 ноября 2009

Я сделал это с помощью метода расширения в HtmlHelper Html.RegisterJavascript( string ). Я создаю ключ "____javascript____" в словаре ViewData. Он содержит словарь записей JavaScript, отобранных из дайджеста JavaScript (для предотвращения дублирования).

Проблема в том, что эти регистрации происходят после обработки заголовка, поэтому теги скрипта должны идти в конце файла. Перед тегом end body у меня есть вызов Html.RenderJavascript(); (мой метод).

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

0 голосов
/ 16 января 2014

1- Класс методов добавления расширений

public static class Extentions
    {
public static void AddRegisterClientsSript(this HtmlHelper helper, string key, string script)
        {
            Dictionary<string, string> scripts;
            if (helper.ViewBag.RegisterClientsSript != null)
            {
                scripts = (Dictionary<string, string>)helper.ViewBag.RegisterClientsSript;
            }
            else
            {
                scripts = new Dictionary<string, string>();
                helper.ViewBag.RegisterClientsSript = scripts;
            }

            if (!scripts.ContainsKey(key))
            {
                scripts.Add(key, script);
            }

        }

        public static MvcHtmlString RegisterClientsSript(this HtmlHelper helper)
        {
            var outScripts = new StringBuilder();

            if (helper.ViewBag.RegisterClientsSript != null)
            {
                var scripts = (Dictionary<string, string>)helper.ViewBag.RegisterClientsSript;
                foreach (string script in scripts.Values)
                {
                    outScripts.AppendLine(script);
                }
            }

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

        public static MvcHtmlString Paging(this HtmlHelper helper, string uniqId)
        {
            helper.AddRegisterClientsSript("jquerypaginatecss", @"<link href=""/Content/Paginate/jquery.paginate.css"" rel=""stylesheet"" />");
            helper.AddRegisterClientsSript("jquerypaginatejs", @"<script src=""/Content/Paginate/jquery.paginate.js""></script>");
        }
}

2 - добавить пространство имен на странице и использовать его

@using Mirak.Ui.Components

@section scripts{
   @Html.RegisterClientsSript()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...