MVC + RegisterClientScriptInclude / RegisterClientScriptBlock

时间:2009-11-12 17:56:45

标签: javascript asp.net asp.net-mvc

是否有任何MVC等效于Page.ClientScripts.RegisterClientScriptInclude和Page.ClientScripts.RegisterClientScriptBlock?

我希望创建部分视图,这些部分视图很可能会在同一主视图中多次引用。

这些视图很可能有自己的脚本要求,但在每个可能的主视图或母版页上编写包含似乎都是浪费。

此外,我觉得让Partial视图调用一次javascript来初始化它的所有兄弟视图会很敏感。

例如......

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

...我应该只需要调用一次,但只有部分视图在视图中放置了这样的hmtl控件。

所以任何想法如何在ASP.Net MVC框架中实现旧的Page.ClientScripts.RegisterClientScriptInclude和Page.ClientScripts.RegisterClientScriptBlock功能

3 个答案:

答案 0 :(得分:4)

您可以使用具有“一次”属性的Spark视图引擎来实现此目的。 E.g。

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

在视图或部分中使用时,脚本(或者可以是任何其他标记,例如div)只会在名为MasterPageHead的母版页部分中包含一次(可以放在&lt; head&gt;中)。< / p>

不确定这对您是否有帮助,但您要求使用MVC解决方案,而不是WebForms解决方案。

答案 1 :(得分:3)

我在HtmlHelper Html.RegisterJavascript( string )上使用扩展方法完成了这项工作。我在ViewData字典中创建了一个键“____javascript____”。这包含一个javascript条目的字典,该字典是从javascript的摘要中键入的(以防止重复)。

问题是这些注册是在标头处理完毕后发生的,因此脚本标签必须放在文件的末尾。在正文结束标记之前,我调用了Html.RenderJavascript();(我的方法)。

我找不到更好的方法,但我必须想象一个更聪明的解决方案是可能的。

答案 2 :(得分:0)

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()
}