使用JavaScript刷新或检索按钮上的当前信息

时间:2017-07-06 13:43:27

标签: javascript jquery ajax

我将以此为序,我还是JavaScript新手。问题在于更大的应用程序,我们的控制器将信息列表传递给视图,其中某些JavaScript函数依赖于某些ViewModel属性。我写了一个简单的应用程序,希望能够说明我的目标。

以下是将List传递到索引页面的示例控制器:

    public ActionResult Index() {
        List<int> activeIds = new List<int>();
        SqlConnection sqlConn = new SqlConnection(connection_String);

        sqlConn.Open();

        string sqlStr = "SELECT * FROM dbo.[JS-Test] WHERE Active = 1";
        SqlCommand sqlCmd = new SqlCommand(sqlStr, sqlConn);
        SqlDataReader sqlDR = sqlCmd.ExecuteReader();

        if(sqlDR.HasRows) {
            while (sqlDR.Read()) {
                activeIds.Add((int)sqlDR["ID"]);
            }
        }

        sqlDR.Close();
        sqlCmd.Dispose();
        sqlConn.Close();

        return View(activeIds);
    }

这将返回数据库中当前的“活动”项。 (粗略)视图如下......

@model List<int>

@{
    ViewBag.Title = "Index";
}

<p>Current Recognized Count: @Model.Count() </p>
<a href="#" id="printBtn">Print</a>

<script>
$(document).ready(function () {
    $('#printBtn').click(function () {

        var numberOfActiveIds = @Model.Count();

        $.ajax({
            type: "POST",
            url: "/Home/PostResults",
            data: { ids: numberOfActiveIds},
            success: function (results) {
                if(results == "Success") {
                    window.location.href = '/Home/Results';
                }
            }
        });
    });
});
</script>

问题是单击按钮时从数据库中获取当前活动项目数。假设用户在加载几分钟后仍然在页面上保持空闲状态。当他们的页面最初加载时,模型返回列出为活动的5个项目...但是他们一直在等待3个额外的项目在数据库中切换为活动状态共8个。但是,当用户最终点击按钮时将提交5个项目而不是当前的8个项目。

由于设置较大应用程序的性质,我无法运行查询以获取“/ Home / PostResults”ActionResult中当前活动项的数量。有没有办法在功能的其余部分使用刷新模型的值执行之前刷新页面(获取更新的模型)?

如果您有任何其他问题,请告诉我,我很乐意遵守。我已经查看了其他问题和答案,但我没有找到一个适合我的情况。谢谢!

编辑#1

所以,我已将此函数添加到Home控制器,它只返回列表计数为Json。

    public ActionResult GetIds(){
        List<int> activeIds = new List<int>();
        SqlConnection sqlConn = new SqlConnection(connection_String);

        sqlConn.Open();

        string sqlStr = "SELECT * FROM dbo.[JS-Test] WHERE Active = 1";
        SqlCommand sqlCmd = new SqlCommand(sqlStr, sqlConn);
        SqlDataReader sqlDR = sqlCmd.ExecuteReader();

        if (sqlDR.HasRows) {
            while (sqlDR.Read()) {
                activeIds.Add((int)sqlDR["ID"]);
            }
        }

        sqlDR.Close();
        sqlCmd.Dispose();
        sqlConn.Close();

        return Json(activeIds.Count());
    }

视图脚本现在看起来像这样......

<script>
$(document).ready(function () {
    $('#printBtn').click(function () {

        var numberOfActiveIds = @Model.Count();

        $.ajax({
            type: "GET",
            url: "/Home/GetIds",
            success: function(response) {
                numberOfActiveIds = response;

                $.ajax({
                    type: "POST",
                    url: "/Home/PostResults",
                    data: { ids: numberOfActiveIds},
                    success: function (results) {
                        if(results == "Success") {
                            window.location.href = '/Home/Results';
                        }
                    }
                });
            }
        });
    });
});
</script>

我目前收到以下错误...

无法加载资源:服务器响应状态为500(内部服务器错误)

编辑#2

我必须将JsonRequestBehavior设置为AllowGet才能正常工作。再次感谢大家!

2 个答案:

答案 0 :(得分:1)

  

gforce301提到通过ajax调用获取当前活动的一个额外的,单独的方法,使查询到数据库,然后ajax发布返回的&#34;活动&#34;。那可能吗?

是的,这是可能的。这就是我提到它的原因。无论其他人如何认为你 应该 这样做,我明白你可能会限制你为什么不能这样做 他们的方式 即使他们没有。

以下代码是您的代码重组。它将2个ajax调用链接在一起,第二个调用取决于第一个成功。注意第一个ajax调用的成功处理程序中的注释块。由于我不知道答案是什么,我无法填写有关如何使用它的部分。这实现了让用户只按一下按钮的目标。

<script>
$(document).ready(function () {
    $('#printBtn').click(function () {

        var numberOfActiveIds = @Model.Count();

        $.ajax({
            type: 'GET',
            url: '/path/to/get/activeIds',
            success: function(response) {
                /*
                    Since I don't know the structure of response
                    I have to just explain.

                    use response to populate numberOfActiveIds

                    now we just make our post ajax request.
                */

                $.ajax({
                    type: "POST",
                    url: "/Home/PostResults",
                    data: { ids: numberOfActiveIds},
                    success: function (results) {
                        if(results == "Success") {
                            window.location.href = '/Home/Results';
                        }
                    }
                });
            }
        });


    });
});
</script>

答案 1 :(得分:0)

我可以给你一个想法,我希望它可以提供帮助,

在btnclick上运行另一个ajax 1st以再次获取数据(或数据计数),如果记录计数大于当前然后更新视图并且没有PostResults,如果它相同那么只是PostResults

关于ajax成功,您可以重新加载数据或视图 并且在失败时(没有新记录时)只做PostResults