使用Controller隐藏iFrame

时间:2009-12-23 20:24:30

标签: asp.net-mvc iframe controller fancybox

我试图找到答案并遇到一些没有产生预期结果的事情。

所以我写了一个HTML Helper加载到(fancybox)iFrame中:
<%= Html.ActionFrame("Projects", "Edit") %>

结果页面有一个保存按钮,当前保存数据并重定向到iFrame中的索引页面。行动如下:

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

但我想要做的是点击保存后iFrame会关闭以及保存数据。

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

提前致谢!

3 个答案:

答案 0 :(得分:1)

好吧,我想我得到了这个。 我在共享目录中创建了一个名为Close的视图,其内容为:

<%@ 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的页面。

答案 1 :(得分: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>

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

答案 2 :(得分:0)

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

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

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