2011-03-26 47 views
2

我有一个简单的部分视图,我想每5秒自动调用一次服务器上的方法。部分视图每5秒调用一次服务器上的方法 - 页面本身不需要更改

加载局部视图从总体布局:

@{Html.RenderAction("PingServer", "Account"); } 

的控制器是这样的:

public ActionResult PingServer() 
{ 
    return PartialView("PingServer"); 
} 

实际的 “_PingServer” 局部视图:

@{ 
    <script language="javascript" type="text/javascript" 
       src="http://code.jquery.com/jquery-latest.js"> 
    </script> 
    <script language="javascript" type="text/javascript"> 
     $(function() { 
      setInterval(Foo, 5000); 
     }); 

     function Foo() { 
      $.post("/Shared/ImHere.ashx", null, function() { }); 
     }  
    </script> 
} 

的实际"ImHere.ashx.cs"看起来是这样的:

public class ImHere : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     SiteUser.ImHere(); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

======================

这只是不工作。

它实际上用于在MVC2上工作,但在MVC3上没有更多。 我理解部分视图在MVC3中处理的方式现在与“_”(下划线)的概念有点不同,并且不确定这是否是问题。 我尝试重命名该部分视图_PingServer ...但仍然没有效果。

也许这是我加载部分视图为Html.RenderAction而不是Html.RenderPartial?

想法是,该调用需要每5秒运行一次,而不是在页面上更改一件事。

任何想法??

+0

我可以问为什么你需要这个每5秒? – redsquare 2011-03-26 18:09:24

+0

我猜你在发布代码之前已经简化了一些代码。我认为'RenderPartial'更有意义。另外,如何使用控制器/操作本身而不是'ashx'。最后,你还没有提到**是错误的?什么都没有发生?您是否尝试过在Chrome中进行调试?您是否尝试过Fiddler或Firebug来查看jQuery是否正在请求服务器? – gideon 2011-03-26 18:15:30

+0

这用于处理MVC2 .. 我应该使用anotehr控制吗?当然,如果它的工作原理......但那是我在做MVC2时尝试做的事情,从未工作过。这就是我使用“ashx”的想法结束的原因(因为我无法将其作为正常控件)。 你将如何做一个每5秒钟调用一次服务器的局部视图控件,并且它可以在任何加载的页面上工作? – 2011-03-27 03:56:27

回答

2

你并不需要使用RenderAction,你可以只使用

@Html.Partial('partialName') 

呈现局部视图。使用这可以消除对动作方法的需求。

而且你的部分观点不应该是内@ { }只是

<script language="javascript" type="text/javascript" 
      src="http://code.jquery.com/jquery-latest.js"> 
</script> 
<script language="javascript" type="text/javascript"> 
    $(function() { 
     setInterval(Foo, 5000); 
    }); 

    function Foo() { 
     $.post("/Shared/ImHere.ashx", null, function() { }); 
    }  
</script> 

因为它只是HTML

+0

您还可以确认您的ImHere处理程序独立于此整个过程,例如直接导航到URL? – 2011-03-26 18:16:41

0

在你Foo JavaScript函数您呼叫的/Shared/ImHere.ashx处理程序,所以你不应该指望/Account/PingServer在AJAX呼叫期间被击中的动作。它只会在初始页面加载时被击中。

万事达布局:

@{Html.RenderAction("PingServer", "Account"); } 

控制器:

public class AccountController: Controller 
{ 
    public ActionResult PingServer() 
    { 
     return PartialView(); 
    } 
} 

对应的部分(~/Views/Account/PingServer.cshtml)。注意去除@{}块,因为它们不是必要的,也是使用URL帮手打造的URL服务器脚本,以避免硬编码,如果您的应用程序托管在一个虚拟目录中的IIS可能打破:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script> 
<script type="text/javascript"> 
    $(function() { 
     setInterval(Foo, 5000); 
    }); 

    function Foo() { 
     // here you are posting to an ASHX handler so don't expect 
     // the controller action to ever be hit 
     $.post('@Url.Content("~/Shared/ImHere.ashx")', null, function (result) { 
      // do something with the result of the AJAX call like update 
      // some part of the DOM 
     }); 
    }  
</script> 
+0

下面的HTML渲染但它从来没有碰到服务器(顺便说一句,我还对网站/共享/ ImHere.ashx添加的网页 - 和一个下查看/共享):

2011-03-27 04:24:37

0

David, 你最近的评论帮我找到了问题。

意见:你能确认你的ImHere处理程序,如通过直接

问题导航到URL独立工作这整个过程的:名字空间失配

当我加入一个NEW文件添加到类型为AHXS的项目中,默认情况下,Visual Studio为它的HTML部分和CS命名空间“ProjectName.DLLName.Folder”。

我确实将CS命名空间重命名为不同的名称(即ProjectName.Folder),但Visual Studio在我编译时没有抱怨。

geeee ..这是一个新手错误!
无论如何感谢所有的帮助。

相关问题