61

有没有办法在新窗口中从控制器操作打开视图?

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

如何让 NewWindow.cshtml 视图在新的浏览器选项卡中打开?

我知道如何通过视图中的链接来做到这一点 - 这不是问题。有没有人想出办法从控制器动作中做到这一点?

4

8 回答 8

82

这不能从控制器本身完成,而是从您的视图中完成。在我看来,您有两个选择:

  1. 使用“_blank”属性装饰您的链接(使用 HTML 帮助程序和直接 HMTL 语法的示例)

    • @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")

于 2013-01-24T19:59:58.600 回答
43

您也可以在表单中使用 Tommy 的方法:

@using (Html.BeginForm("Action", "Controller", FormMethod.Get, new { target = "_blank" }))
{
//code
}
于 2013-06-26T18:09:48.340 回答
7

你问错问题了。代码隐藏(控制器)与前端的工作无关。事实上,这就是 MVC 的优势——您将代码/概念与视图分开。

如果您希望某个动作在新窗口中打开,那么指向该动作的链接需要告诉浏览器在单击时打开一个新窗口。

一个伪例子:<a href="NewWindow" target="_new">Click Me</a>

这就是它的全部。设置指向该操作的链接目标。

于 2013-01-24T19:58:23.113 回答
4

是的,你可以做一些棘手的工作来模拟你想要的:

1)通过ajax从视图中调用您的控制器。2)返回您的视图

3)在 $.ajax 请求的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(); }
        });            
    });      
于 2013-06-08T20:35:31.070 回答
2

您可以使用如下

public ActionResult NewWindow()
{
    return Content("<script>window.open('{url}','_blank')</script>");
}
于 2019-07-02T08:34:35.643 回答
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>
于 2014-12-11T07:22:47.447 回答
0

我已经看到你可以在哪里做这样的事情,假设“NewWindow.cshtml”在你的“Home”文件夹中:

string url = "/Home/NewWindow";
return JavaScript(string.Format("window.open('{0}', '_blank', 'left=100,top=100,width=500,height=500,toolbar=no,resizable=no,scrollable=yes');", url));

或者

return Content("/Home/NewWindow");

如果您只想在选项卡中打开视图,您可以使用 JavaScript 点击事件来呈现您的部分视图。这将是 NewWindow.cshtml 的控制器方法:

public ActionResult DisplayNewWindow(NewWindowModel nwm) {
    // build model list based on its properties & values
    nwm.Name = "John Doe";
    nwm.Address = "123 Main Street";
    return PartialView("NewWindow", nwm);
}

您在页面上的标记将如下所示:

<input type="button" id="btnNewWin" value="Open Window" />
<div id="newWinResults" />

和 JavaScript(需要 jQuery):

var url = '@Url.Action("NewWindow", "Home")';
$('btnNewWin').on('click', function() {
    var model = "{ 'Name': 'Jane Doe', 'Address': '555 Main Street' }"; // you must build your JSON you intend to pass into the "NewWindowModel" manually
    $('#newWinResults').load(url, model); // may need to do JSON.stringify(model)
});

请注意,此 JSON 将覆盖上述 C# 函数中的内容。我把它放在那里只是为了演示如何对值进行硬编码。

(改编自Rendering partial view on button click in ASP.NET MVC

于 2018-11-29T01:04:12.113 回答
0

我在我的控制器中分配了 javascript:

model.linkCode = "window.open('https://www.yahoo.com', '_blank')";

在我看来:

@section Scripts{
    <script @Html.CspScriptNonce()>

    $(function () {

        @if (!String.IsNullOrEmpty(Model.linkCode))
        {
            WriteLiteral(Model.linkCode);
        }
    });

那打开了一个带有链接的新标签,然后转到它。

有趣的是,在本地运行它会使用弹出窗口阻止程序,但似乎在服务器上运行良好。

于 2020-09-10T13:36:08.857 回答