【问题标题】:where to add jQueryUI scripts in MVC page在 MVC 页面中添加 jQueryUI 脚本的位置
【发布时间】:2013-04-25 13:20:37
【问题描述】:

我正在使用 EditorTemplates 文件夹和以下 DateTime.cshtml 将日期选择器 (jQuery UI) 添加到所有日期时间字段:

@model Nullable<System.DateTime>
@if ( Model.HasValue ) {
@Html.TextBox( "" , String.Format( "{0:yyyy-MM-dd HH:mm}" , Model.Value ) , new  {     @class = "textbox" , @style = "width:400px;" } )
}
else {
@Html.TextBox( "" , String.Format( "{0:yyyy-MM-dd HH:mm}" , DateTime.Now ) , new {     @class = "textbox" , @style = "width:400px;" } )
}

@{
string name = ViewData.TemplateInfo.HtmlFieldPrefix;
string id = name.Replace( ".", "_" );
}
<script type="text/javascript">
$(document).ready(function () {
    alert("adding date picker");
    $("#@id").datepicker
        ({
            dateFormat: 'dd/mm/yy',
            showStatus: true,
            showWeeks: true,
            highlightWeek: true,
            numberOfMonths: 1,
            showAnim: "scale",
            showOptions: {
                origin: ["top", "left"]
            }
        });
});
</script>

但是,如果我将 jQuery 脚本等添加到页面底部,现在建议是最佳做法 - 上面的代码内联显示 - 在 jQuery 脚本上方 - 因此不会运行:

主 CSHTML Razor 视图:

 @RenderBody()   
        <hr>
        <footer>
            <p>&copy; Company @System.DateTime.Now.ToString("yyyy")</p>
        </footer> 
    </div>
     @Scripts.Render("~/js")
     @Scripts.Render("~/jqueryui")
     @RenderSection("Scripts", required: false)
</body>

我是否应该绕过最佳实践并将 jQuery 脚本添加到页面顶部 - 还是有更简单的方法来完成这项工作,同时仍遵循最佳实践?

谢谢,

标记

【问题讨论】:

  • @Scripts.Render 应该在 head 标签内,不是吗?
  • 你试过用window.onload = function{...};而不是 document.ready ?或者选择 Kenneth 的答案,这在你的情况下似乎更准确。
  • @MelanciaUK:脚本不应该放在 head-tag 中,这会减慢页面渲染速度。
  • @roasted:如果他使用 window.onload,那么他的脚本将在严格必要的时候执行
  • 这可能会有所帮助:stackoverflow.com/questions/7081009/…

标签: jquery asp.net asp.net-mvc jquery-ui


【解决方案1】:

你应该把它放在以下部分:

@section Scripts { 

    <script type="text/javascript">
$(document).ready(function () {
    alert("adding date picker");
    $("#@id").datepicker
        ({
            dateFormat: 'dd/mm/yy',
            showStatus: true,
            showWeeks: true,
            highlightWeek: true,
            numberOfMonths: 1,
            showAnim: "scale",
            showOptions: {
                origin: ["top", "left"]
            }
        });
});
</script>
}

这样你的脚本将被添加到 jQuery 声明下面

【讨论】:

  • @id 来自哪里?不要忘记您不能在部分或模板中包含部分。
【解决方案2】:

您的视图或部分中不应包含任何脚本。脚本应该放在它们所属的地方 - 在单独的 javascript 文件中。

所以你可以有一个启用日期选择器的 javascript 文件,例如 ~/scripts/myscript.js:

$('.datepicker').datepicker({
    dateFormat: 'dd/mm/yy',
    showStatus: true,
    showWeeks: true,
    highlightWeek: true,
    numberOfMonths: 1,
    showAnim: "scale",
    showOptions: {
        origin: ["top", "left"]
    }
});

如您所见,我在这里使用了一个类选择器:$('.datepicker'),以便将 datepicker 插件附加到所有具有 class="datepicker" 的输入字段。

现在剩下的就是覆盖视图中的脚本自定义部分(不是在部分或模板中):

@section Scripts {
    <script type="text/javascript" src="~/scripts/myscript.js"></script>
}

现在您的模板将只包含模板应包含的内容 - 标记:

@model DateTime?
@Html.TextBox(
    "", 
    string.Format("{0:yyyy-MM-dd HH:mm}", Model ?? DateTime.Now), 
    new { 
        @class = "textbox datepicker", 
        @style = "width:400px;" 
    } 
)

您可能还会注意到代码的简化。

现在,由于您遵循最佳实践将所有脚本放在单独的文件中,您甚至可以为它们打包:

@section Scripts {
    @Scripts.Render("~/datepickers")
}

或者简单地将它包含在布局中的某些包中,以便它被缩小并与它们一起缓存并可供所有页面使用。

【讨论】:

  • 你能详细说明一下吗?
  • 这并不能解决 OP 的问题,他仍然需要从他的局部视图中引用脚本,因为他只想在加载局部视图时包含它
  • 不,他不需要从局部视图中引用任何脚本。脚本只能从主视图或布局内引用。 @Floremin,你还想让我做什么?
  • 我认为您已经详细说明了上次更新。谢谢!
  • 谢谢大家 - 我已将脚本添加到 JS 和捆绑中 - 并且还简化了标记。与往常一样,我感谢您的帮助。标记
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多