繁体   English   中英

MVC + RegisterClientScriptInclude / RegisterClientScriptBlock

[英]MVC + RegisterClientScriptInclude / RegisterClientScriptBlock

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

我希望创建部分视图,可以从同一主视图中多次引用。

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

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

例如...

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

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

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

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

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

当在视图或部分中使用时,脚本(或者可以是任何其他标记,例如div)将仅在名为MasterPageHead的主页面部分中包含一次(可以放在<head>中)。

不确定这对你有用,但你要求的是MVC解决方案,而不是WebForms解决方案。

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

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

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

1-添加Extentions方法类

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM