以下是日历的示例扩展方法:
public static string Calendar(this HtmlHelper html)
{
return "<input type='text' onclick='showCalendar(this)'/>";
}
函数showCalendar()在calendar.js中定义。
是否可以通过扩展方法注册对calendar.js的引用?
Html.Calendar()可以多次调用,但只应包含一个脚本。
答案 0 :(得分:1)
简答:是的。
接下来是......
但您需要更改退货类型。如果你只是返回一个字符串,它将被编码,所以你的浏览器实际上不会运行脚本块。
在Chrome中你会得到像这样的“”注意引号。为了解决这个问题,请使用IHtmlString作为返回类型,并使双重确定返回helper.Raw。
public static IHtmlString RegisterScripts(this HtmlHelper helper)
{
return helper.Raw("<script>function () { DO SOMETHING }</script>");
}
答案 1 :(得分:0)
很好的问题..暂时我只是制作另一个扩展方法,从中返回脚本注册(比如RegisterCalendarScriptBloc()),但最好在第一次需要依赖时自动包含。< / p>
答案 2 :(得分:0)
如果您使用的是WebForms视图(未经过测试),请尝试使用以下内容:
using System.Web.UI.HtmlControls;
public static string Calendar(this HtmlHelper html, HtmlHead head)
{
var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
var url = urlHelper.Content("~/Script/calendar.js");
//var scriptControl = new HtmlGenericControl("script");
//scriptControl.Attributes.Add("src", url);
//scriptControl.Attributes.Add("type", "text/javascript");
//if(head.Controls.Contains(scriptControl))
//{
// head.Controls.Add(scriptControl);
//}
// or
if(!head.Controls.Cast<Control>().Any(x => (x as HtmlGenericControl) != null
&& (x as HtmlGenericControl).Attributes["src"] == url))
{
var scriptControl = new HtmlGenericControl("script");
scriptControl.Attributes.Add("src", url);
scriptControl.Attributes.Add("type", "text/javascript");
head.Controls.Add(scriptControl);
}
return "<input type='text' onclick='showCalendar(this)'/>";
}
在视图中:
<%= Html.Calendar(Header) %>
希望这有效:)