2013-01-24 122 views
33

有什麼方法可以在新窗口中從控制器操作打開視圖?從控制器的新窗口打開mvc視圖

public ActionResult NewWindow() 
{ 
    // some code 
    return View(); 
} 

我該如何獲得NewWindow.cshtml視圖在一個新的瀏覽器標籤中打開?

我知道如何從視圖中的鏈接 - 這不是問題。有沒有人想出了一個辦法,從控制器動作

回答

55

這不能從控制器本身完成,而是從您的視圖中完成。在我看來,你有兩個選擇:

  1. (使用HTML幫助和直HMTL語法示例)裝飾用 「_blank」 屬性您的鏈接

    • @Html.ActionLink("linkText", "Action", new {controller="Controller"}, new {target="_blank"})
    • <a href="@Url.Action("Action", "Controller")" target="_blank">Link Text</a>
  2. 使用Javascript打開新窗口

    window.open("Link URL")

+1

如果我想在鏈接的新窗口中打開一個視圖,可以使用它:@ Html.ActionLink(「linkText」,「Action」,「Controller」,new {target =「_ blank」}。沒有測試過將控制器作爲對象routeValue傳遞,爲什麼你會這樣?但那不是問題。儘管「不能完成」你確實回答了原始問題,所以我將其標記爲答案。 – Joe

+0

@Joe - 這只是我使用的Html.ActionLink重載的選擇,它具有以下簽名 - Html.ActionLink(string linkText,string Action,object routeValues,object htmlAttributes) - 但它只是個人選擇,您可以使用你希望接受htmlAttributes參數的任何重載。 – Tommy

+0

有沒有一種方法來定義新窗口的尺寸? (使用剃刀) – barnes

7

你在問錯誤的問題。代碼隱藏(控制器)與前端的功能無關。事實上,這就是MVC的優勢 - 你將代碼/概念從視圖中分離出來。

如果您想要在新窗口中打開某個操作,那麼指向該操作的鏈接需要通知瀏覽器在單擊時打開一個新窗口。

僞例如:<a href="NewWindow" target="_new">Click Me</a>

,這一切就是這麼簡單。設置該動作的鏈接目標。

+0

什麼是對POST控制器方法等與所述提交行爲視圖代碼從視圖傳遞表單對象等離子?上面的動作默認爲GET。 – AKS

+0

如果你必須做一個帖子,那麼你會做一個'

'同樣,這是一個前端解決方案,與無關後端。 –

2

是的,你可以做一些棘手的作品模擬你想要什麼:

1)從阿賈克斯視圖打電話給你的控制器。 2)返回您查看

3)使用類似的success以下(或者error錯誤對我的作品)部分的$就要求:!

$("#imgPrint").click(function() { 
     $.ajax({ 
      url: ..., 
      type: 'POST', dataType: 'json', 
      data: $("#frm").serialize(), 
      success: function (data, textStatus, jqXHR) { 
       //Here it is: 
       //Gets the model state 
       var isValid = '@Html.Raw(Json.Encode(ViewData.ModelState.IsValid))'; 
       // checks that model is valid      
       if (isValid == 'true') { 
        //open new tab or window - according to configs of browser 
        var w = window.open(); 
        //put what controller gave in the new tab or win 
        $(w.document.body).html(jqXHR.responseText); 
       } 
       $("#imgSpinner1").hide(); 
      }, 
      error: function (jqXHR, textStatus, errorThrown) { 
       // And here it is for error section. 
       //Pay attention to different order of 
       //parameters of success and error sections! 
       var isValid = '@Html.Raw(Json.Encode(ViewData.ModelState.IsValid))';      
       if (isValid == 'true') { 
        var w = window.open(); 
        $(w.document.body).html(jqXHR.responseText); 
       } 
       $("#imgSpinner1").hide(); 
      }, 
      beforeSend: function() { $("#imgSpinner1").show(); }, 
      complete: function() { $("#imgSpinner1").hide(); } 
     });    
    });  
30

您可以使用湯米在形式方法,以及:

@using (Html.BeginForm("Action", "Controller", FormMethod.Get, new { target = "_blank" })) 
{ 
//code 
} 
+0

這就是我正在尋找的。謝謝。 – ChepA

+0

在我發現的所有可能的解決方案中,這是最好的,在我的opnion。這是最簡單的,因爲它使用MVC框架。 – mcampos

+0

默認提交操作是發佈並提交最終操作。我們如何發佈表單以啓動部分視圖(以便在單獨的窗口中)以避免主窗口數據丟失。簡單的場景就像主表單提交提交用戶選擇的臨時客戶端保存的n個文件並預覽第一個。但用戶可能會預覽某個文件,但仍未提交表單。在這種情況下,用戶可能需要在新選項卡中查看該文件。所以我們如何爲一個具有不同視圖的表單創建兩個POST方法。 – AKS

0
@Html.ActionLink("linkText", "Action", new {controller="Controller"}, new {target="_blank",@class="edit"}) 

    script below will open the action view url in a new window 

<script type="text/javascript"> 
    $(function(){ 
     $('a.edit').click(function() { 
      var url = $(this).attr('href'); 
      window.open(url, "popupWindow", "width=600,height=800,scrollbars=yes"); 
      }); 
      return false; 
     }); 
</script>