jQuery函数在MVC Partial View中不起作用

时间:2017-09-14 18:50:52

标签: javascript jquery asp.net-mvc asp.net-mvc-4

我的局部视图中的.hide函数最初不是为第二人和第三人渲染,然后延迟.hide和.fadein也不起作用。我是js和jquery的新手所以我可能错过了一些明显的东西......为什么这个js脚本不能在局部视图中工作?

一切都在主视图中有效,但我需要部分视图的原因是因为我不想每15秒重新加载整个页面。我做了一些研究,得到一个html数据类型可能有问题吗?

主要观点:

@model IEnumerable<project.Models.MyList>

<div id="scrolllist">
    @Html.Partial("_ScrollList")
</div>

@section Scripts{
<script>
function loadScrollListPV() {
   $.ajax({
    url: "@Url.Action("ScrollList")",
    type: 'GET', // <-- make a async request by GET
    dataType: 'html', // <-- to expect an html response
    success: function(result) {
                $('#scrolllist').html(result);
             }
   });
}
$(function() {
    loadScrollListPV();
    // re-call the functions each 15 seconds
    window.setInterval("loadScrollListPV()", 15000);
});
</script>
}

控制器操作:

    public ActionResult ScrollList()
    {
        return PartialView("_ScrollList", db.MyList.ToList());
    }

部分视图:

@model IEnumerable<project.Models.MyList>


<div id="firstperson">
@*Get lastest record and display.*@
@foreach (var donor in Model.OrderByDescending(p => p.ProcessTime).Take(1))
{
}
</div>

<div id="secondperson">
@*Get second lastest record and display.*@
@foreach (var donor in Model.OrderByDescending(p => p.ProcessTime).Skip(1).Take(1))
{       
}
</div>

<div id="thirdperson">
@*Get third lastest record and display.*@
@foreach (var donor in Model.OrderByDescending(p => p.ProcessTime).Skip(2).Take(1))
{        
}
</div>

@section Scripts{
<script>
$("#secondperson").hide();
$("#thirdperson").hide();
function person() {
    $("#firstperson").delay(5000).hide(0, function () {
        $("#secondperson").fadeIn();
        $("#secondperson").delay(5000).hide(0, function () {
            $("#thirdperson").fadeIn();
            $("#thirdperson").delay(5000).hide(0, function () {
                $("#firstperson").fadeIn();
                person();
            });
        });
    });
}
</script>
}

任何帮助都会很棒,并提前感谢!

3 个答案:

答案 0 :(得分:3)

我不是100%肯定在这里,但我认为根据此answer在部分视图中呈现@script部分可能存在问题。提到默认情况下,部分视图无法使用@section元素。

尝试删除脚本部分周围的剃刀语法,然后使用:

<script type="text/javascript">
    $("#secondperson").hide();
    $("#thirdperson").hide();
    function person() {
    $("#firstperson").delay(5000).hide(0, function () {
        $("#secondperson").fadeIn();
        $("#secondperson").delay(5000).hide(0, function () {
        $("#thirdperson").fadeIn();
        $("#thirdperson").delay(5000).hide(0, function () {
            $("#firstperson").fadeIn();
            person();
        });
    });
});
}
</script>

答案 1 :(得分:0)

您无法在局部视图中调用某个部分。您可以将其称为Layout = null的操作;达到类似的结果。

答案 2 :(得分:0)

1)删除@section Scripts{,您的代码将有效。

2)你应该避免hide()fadeIn()的回调地狱。如果有10个divs,则必须添加10个代码层。以下方法适用于部分视图中的任意数量的divs

您可以为您的div分配class。默认情况下仅使第一个div可见。创建一个每5秒调用一次的函数。

<div class="content-div">first content</div>
<div class="content-div" style="display:none">second content</div>
<div class="content-div" style="display:none">third content</div>

<script>
    partialIntervalRef = setInterval(incremental, 5000);

    // gets the currently visible div. Hides it.
    // If this is last content `div`, shows the first div, else shows the next div
    function incremental() {
        $visible = $(".content-div:visible");
        $visible.hide();

        $visible.next().is('.content-div')
            ? $visible.next().fadeIn()
            : $(".content-div").first().fadeIn();
    }
</script>

partialIntervalRef变量将在global范围(主视图)中定义。每次加载部分视图之前,都应该清除它。

<script>
    var partialIntervalRef;

    function loadScrollListPV() {
        clearInterval(partialIntervalRef);
        -----
        ----
        }

这比使用回调更加清晰和可扩展。 如果你想测试一下,这是一个FIDDLE

3)window.setInterval("loadScrollListPV()", 15000)应更改为window.setInterval(loadScrollListPV, 15000)