Section Scripts或常规<script>取决于请求类型

时间:2016-07-02 09:45:52

标签: asp.net-mvc razor asp.net-mvc-5

我有一个场景,我想根据请求类型加载脚本。例如,假设我有这段代码:

&#xA;&#xA;
  @section scripts {&#xA;&lt; script&gt;&#xA; $( '#tabsContainer')InitializeTabs();&#XA;&LT; /脚本&GT;&#XA;}&#XA;  
&#XA;&#XA;

此当我想加载整页时,加载完全正常。但是,我有一个用户可以部分加载页面的东西。场景是这样的:

&#xA;&#xA;
  public ActionResult Page(){&#xA; if(Request.IsAjax())返回PartialView();&#xA ;返回View()&#xA;}&#xA;  
&#xA;&#xA;

问题是,如果部分加载,脚本不起作用,因为@部分脚本不能部分工作。如果我把它放在section脚本之外,它不能在完整视图上工作,因为我的脚本在底部,并且它正在尝试在加载实际的JavaScript文件之前运行脚本。

&#xA;&# xA;

我想知道实现这个的好方法。我可以在页面顶部移动我的脚本,这应该可以解决所有问题。我也可能有两个不同的脚本,但这可能意味着我必须编写两次相同的代码。

&#xA;&#xA;

有没有人知道实现这个的好方法?也许是一个Html帮助程序,它根据请求类型在@section脚本{}或常规脚本标记中加载脚本?

&#xA;&#xA;

基本上,写这个的正确方法是什么:

&#xA;&#xA;
  @if(!Request。 IsAjaxRequest())&#XA; {&#XA; &LT;文本&GT;&#XA; @section scripts&#xA; {&#XA; &LT;脚本&GT;&#XA; $(function(){&#xA; $(“#tabs”)。tabs();&#xA;});&#xA; &LT; /脚本&GT;&#XA; }&#XA; &LT; /文本&GT;&#XA;}&#XA;否则&#XA; {&#XA; &LT;文本&GT;&#XA; &LT;脚本&GT;&#XA; $(function(){&#xA; $(“#tabs”)。tabs();&#xA; ga('set','page','/ new-page.html'); //更新Google Analytics&#xA;});&#xA; &LT; /脚本&GT;&#XA; &lt; / text&gt;&#xA;}&#xA;  
&#xA;&#xA;

提前感谢您的帮助。

&#XA;

3 个答案:

答案 0 :(得分:0)

你可以在view()

中查看
@if (Request.IsAjaxRequest())
{
<script>
    alert('Partial view');
</script>
}
else
{
<script>
    alert('Main view');
</script>
}

答案 1 :(得分:0)

我还没有机会测试的想法:在视图中存储一些关于请求是否是ajax请求的信息(例如在数据属性中),然后在脚本测试中那个价值并相应地做。

E.g:

 <body data-isajaxrequest="@Request.IsAjaxRequest()">...</body>

然后是剧本:

$(function () {
    function InitializeTabs() {
        $("#tabs").tabs();
        if ($("body").data("isajaxrequest")) {
            // it's an ajax request
        } else {
            // not an ajax request
            ga('set', 'page', '/new-page.html'); // Update Google Analytics
        }
    }

    $('#tabsContainer').InitializeTabs();
});

根据需要将您的逻辑放在评论的位置。实际的脚本将进入完整视图。正如另一张海报所提到的,你不应该在部分视图中使用脚本。

答案 2 :(得分:0)

您可以尝试使用本机JavaScipt方式来解决此问题:

var myFunction = function () {
   alert('myFunction called after 500ms.');
  // do a lot of stuff here
}

// and then call the function after the page is loaded
// let's supose an half second later:

setTimeout(myFunction, 500);