具有两个可变时间查询的一个视图和一个控制器

时间:2016-10-08 18:10:34

标签: c# jquery asp.net-mvc

我对在C#应用程序中实现以下功能感到困惑。

  1. 我的数据库有两个查询指向从那里运行。
  2. Query1最多运行0.2秒,Query2运行0.5秒 - 1.5分钟不固定时间。
  3. 显示从两个查询返回的数字信息的单个视图附加到此控制器。
  4. 半视图内容来自Query1,其余来自Query2。
  5. 控制器在5分钟后刷新,来自DB的新数据进入。
  6. 我需要显示View的前半部分,因为Query1快速运行并检查Query2是否已完成,然后在View上显示其结果?
  7. 我的解决方案是: 隐藏视图的后半部分并等待Query2运行。一旦Query2数据在ViewBag中;取消隐藏并显示后半部分视图。 一旦我离开控制器并显示一半View,我无法回到控制器查看Query2结果。请告知任何解决方案,希望我能够正确地传达我的问题。

    添加控制器代码:

    public ActionResult Show()
        {
            bool dataComing = false;
            logger.AddLog("Show Mehtod Activated");
    
            if (dbConn1 == true)
            {
                try
                {
                    logger.AddLog("DB Connection 2 Data Reading Started.");
                    cmd = DBConnection.CreateCommand();
                    logger.AddLog("DB Connection 2 CReateCommandCalled.");
                    cmd.CommandText = myQuery;
                    logger.AddLog("DB Connection 2 CommandText is set to   Query.");
                    cmd2.CommandText = myQuery2;
                    DbReader = cmd.ExecuteReader();
                    DbReader2 = cmd2.ExecuteReader();
                    dataComing = true;
                    DbReader.Read();
                }
                catch (Exception e)
                {
                    dataComing = false;
                    logger.AddLog("ERROR while intiating DB Connection 1, error is:" + e.ToString());
                    return View();
                }
    
                logger.AddLog("DB Connection 2 Reading Data...");
            }
    
            if (dataComing == true)
            {
                LoggedInAgents = DbReader["loggedinagent"].ToString();
                logger.AddLog("DB Connection 2 Data : LoggedInAgents = " + LoggedInAgents);
                ViewBag.loggedInAgents = LoggedInAgents;
                DbReader.Close();
                SecondData = DbReader2["second"].ToString();
                logger.AddLog("DB Connection 2 Data : LoggedInAgents = " + SecondData );
                ViewBag.second= SecondData;
                DbReader2.Close();
                logger.AddLog("DB Reader Closing");
                cmd.Dispose();
                cmd2.Dispose();
                DBConnection.Close();
                logger.AddLog("DB Connection  Closed");
            }
            else
            {
                ViewBag.loggedInAgents = "00";
                ViewBag.second= "00";
    
            }
    
            logger.AddLog("PAGE Refresh Set to 5 minutes");
            logger.AddLog("Before Refresh Time"+ DateTime.Now.ToString("h:mm:ss tt"));
            Response.AddHeader("Refresh", "300");
            logger.AddLog("PAGE Refresh Called");
            logger.AddLog("After Refresh Time" + DateTime.Now.ToString("h:mm:ss tt"));
           logger.AddLog("Returning From Show Function");
    
            return View();
    
    
        }
    

1 个答案:

答案 0 :(得分:1)

执行返回View()时,razor将在您的视图中执行代码(如果有的话,将模型数据传递给它)并将输出呈现给浏览器,这是纯HTML。

如果您想要处理以后的行为,则应使用ajax 来获取第二个查询执行结果。让您的操作方法返回第一个操作方法的数据,并在视图中,您可以在文档就绪事件上对服务器进行ajax调用。当结果返回时,将其附加到DOM。

您可以使用$ .get方法为第二个查询数据进行ajax调用。所以在你看来,添加这个代码

<div id="dataForSecond"></div>
@section scripts
{
  <script>
    $(function(){
      $.get("@Url.Action("GetData","Home")",function(data){
          $("#dataForSecond").html(data);
      });
    });
  </script>
}

假设你的HomeController中有一个名为GetData的动作方法,它执行你的第二个查询并返回数据

public ActionResult GetData()
{
  var secondData="ReplaceThisWithValueComingFromYourQuery";
  return Json(secondData,JsonRequestBehavior.AllowGet);
}

如果要在特定时间间隔内刷新数据,可以考虑使用setInterval方法进行ajax调用以获取数据。

以下代码将每5秒更新一次div内容。

$(function(){
   var refreshInterval = 5000;
   var url="@Url.Action("GetData","Home")";

   setInterval(function () {
        $("#dataForSecond").load(url);         
    }, refreshInterval);   
});