我有一个带有内联JavaScript的ASP.NET MVC应用程序,它只适用于特定的视图。
如果我将所有JavaScript放在主布局页面上,我会收到错误消息,因为所有页面上都没有ID。
有没有办法为每个视图外化JavaScript?
答案 0 :(得分:2)
这是一种方法。这是使用剃刀视图引擎
在head标签之间的布局页面中创建一个部分
<head>
@RenderSection("Head", required: false);
</head>
然后在您的视图中创建一个部分并将脚本标记放入其中。
@section Head
{
<script type="text/javascript">
do some java script...
</script>
}
您还可以引用特定于该页面的外部库,例如灯箱或其他内容。
答案 1 :(得分:1)
如果您使用的是MVC 2,则可以使用内容占位符。
// this goes in your master page in your head tag
<asp:ContentPlaceHolder id="Script" runat="server"/>
// this goes in your view -- not partial
<asp:Content ID="Content1" ContentPlaceHolderID="script" runat="server">
<script type="text/javascript" src="foo.js"></script>
</asp:Content>
在MVC 3中,您可以this。
答案 2 :(得分:1)
我使用HtmlHelper扩展来在每个控制器操作上注册我使用过的脚本,“MasterPage”使用正确的脚本标记呈现每个注册的脚本。
的HtmlHelper:
public static void RegisterScript(string path)
{
if (!HttpContext.Current.Items.Contains("RegisteredScripts"))
HttpContext.Current.Items.Add("RegisteredScripts", ";" + path);
else
HttpContext.Current.Items["RegisteredScripts"] = ";" + path;
}
public static MvcHtmlString RegisteredScripts(this HtmlHelper html)
{
var lines = new StringBuilder();
if (html.ViewContext.HttpContext.Items.Contains("RegisteredScripts"))
{
foreach (var k in html.ViewContext.HttpContext.Items["RegisteredScripts"].ToString().Substring(1).Split(';'))
{
lines.Append(html.Script(k));
}
}
return MvcHtmlString.Create(lines.ToString());
}
// Helper-functions
public static MvcHtmlString Script(this HtmlHelper html, string path)
{
if (!ExistsInContext(html, path))
{
return Render(html, "<script type=\"text/javascript\" src=\"{0}\"></script>", path);
}
return MvcHtmlString.Create("");
}
private static bool ExistsInContext(HtmlHelper html, string path)
{
return html.ViewContext.HttpContext.Items.Contains(path);
}
在控制器动作中只需调用:
Helpers.HtmlHelpers.RegisterScript("~/Scripts/custom.js");
希望这有帮助
答案 3 :(得分:0)
javascript可以测试'ID'是否为null或未定义,如果是,则不会触发代码。