1

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

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

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

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

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

我遇到了这个,这是我希望能够为 iFrame 做的类似的事情,它会使转换当前动作更简单。

提前致谢!

4

3 回答 3

1

好吧,我想我明白了。我在 Shared 目录中创建了一个名为 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 的页面。

于 2009-12-23T22:34:11.040 回答
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>

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

于 2009-12-24T00:16:02.030 回答
0

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

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

$.post('/MyController/MyAction',
  { param1: $('field1'), param2: $('field2') }, 
  function(data) {
  if (data) {
    $("#myIFrame").fadeout();
  }
}
于 2009-12-23T21:14:41.450 回答