2009-12-23 89 views
1

我试图找到答案,并遇到了一些没有得到所需结果的东西。使用控制器隐藏iFrames

所以我写了一个HTML辅助加载在(的fancybox)的iFrame:
<%= Html.ActionFrame("Projects", "Edit") %>

结果页面有一个保存按钮目前保存数据,并重定向到iFrame中的索引页。作为动作云:

 if (ModelState.IsValid) 
     { 
      projectRepository.saveProject(record); 
      return RedirectToAction("Index"); 
     } 

但我希望能够做的是,在点击保存的iFrame将关闭并保存数据。

我遇到了this,这与我希望能够为iFrames做的事情类似,它会使当前操作变得更简单。

在此先感谢!

回答

1

好吧,我想我已经得到了这个。 我做一个的关闭共享目录视图,其内容为:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Close</title> 
</head> 
<body> 
    <div> 
     <script type="text/javascript"> 
      parent.$.fn.fancybox.close(); 
      parent.location.reload(true); 
     </script> 
    </div> 
</body> 
</html> 

而且在行动我只是去return View("Close");。它关闭iFrame并刷新调用iFrame的页面。

0

您可以使用jquery.post从iframe调用您的操作。

然后使用.post方法的回调来隐藏iframe。

$.post('/MyController/MyAction', 
    { param1: $('field1'), param2: $('field2') }, 
    function(data) { 
    if (data) { 
    $("#myIFrame").fadeout(); 
    } 
} 
1

我认为返回Close ActionMethod是最好的选择。你可以从你的ActionMethod返回JavaScript结果,但是你正在定义你的html/javascript应该如何在你的ActionMethod中而不是在View中(我并不特别喜欢)。

另一种解决方案是相同的你是...

<script type="text/javascript"> 
    if (window.parent != null) 
     window.parent.location = '<%= Url.RouteUrl(new { 
      controller = "YourContoller", 
      action = "YourAction" }) %>'; 
    else 
     window.location = '<%= Url.RouteUrl(new { 
      controller = "YourController", 
      action = "YourAction" }) %>'; 
</script> 

然后,您可以专门重定向到一个控制器/动作而不仅仅是重载父页面。或者,也许你传回一个参数/模型,确定你应该重定向到哪条路线。

+0

+1,的确,这是一个更好的方法,但由于时间不够,我想我已经实施了我发布的方法。由于我只是关闭fancybox iFrames,我只是重新加载相同的控制器和操作,其他人不参与。 – aredkid 2009-12-25 15:37:43