是否有任何MVC等效于Page.ClientScripts.RegisterClientScriptInclude和Page.ClientScripts.RegisterClientScriptBlock?
我希望创建部分视图,这些部分视图很可能会在同一主视图中多次引用。
这些视图很可能有自己的脚本要求,但在每个可能的主视图或母版页上编写包含似乎都是浪费。
此外,我觉得让Partial视图调用一次javascript来初始化它的所有兄弟视图会很敏感。
例如......
$('input[alt=date]').datepicker();
...我应该只需要调用一次,但只有部分视图在视图中放置了这样的hmtl控件。
所以任何想法如何在ASP.Net MVC框架中实现旧的Page.ClientScripts.RegisterClientScriptInclude和Page.ClientScripts.RegisterClientScriptBlock功能
答案 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()
}