Скрыть iFrames, используя контроллер - PullRequest
1 голос
/ 23 декабря 2009

Я попытался найти ответ на этот вопрос и наткнулся на несколько вещей, которые не дали желаемого результата.

Итак, я написал HTML Helper, который загружается в (fancybox) iFrame:
<%= Html.ActionFrame("Projects", "Edit") %>

Полученная страница имеет кнопку сохранения, которая в настоящее время сохраняет данные и перенаправляет их на страницу индекса в iFrame. Как проходит действие:

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

Но я хочу, чтобы после нажатия кнопки сохранения iFrame закрывался, а также сохранял данные.

Я столкнулся с этим , что-то похожее, что я хотел бы сделать для iFrames, это упростило бы преобразование текущих действий.

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 24 декабря 2009

Хорошо, я думаю, что получил это. Я создал представление с именем 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 голос
/ 24 декабря 2009

Я думаю, что возвращение Close ActionMethod - ваш лучший выбор. Вы можете вернуть результат JavaScript из вашего ActionMethod, но затем вы определяете, как ваш 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 голосов
/ 24 декабря 2009

Вы можете использовать jquery.post для вызова своего действия из iframe.

затем используйте обратный вызов из метода .post, чтобы скрыть iframe.

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