Asp.net mvc 4 在控制器的新窗口中打开mvc视图

Asp.net mvc 4 在控制器的新窗口中打开mvc视图,asp.net-mvc-4,Asp.net Mvc 4,有没有办法在新窗口中从控制器操作打开视图 public ActionResult NewWindow() { // some code return View(); } 如何在新的浏览器选项卡中打开NewWindow.cshtml视图 我知道如何从视图中的链接执行此操作-这不是问题所在。有人从控制器的动作中想出了一个方法吗?你问错了问题。代码隐藏(控制器)与前端的工作无关。事实上,这就是MVC的优势所在——将代码/概念与视图分离 如果希望在新窗口中打开某个操作,则指向该操作的链

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

public ActionResult NewWindow()
{
    // some code
    return View();
}
如何在新的浏览器选项卡中打开NewWindow.cshtml视图


我知道如何从视图中的链接执行此操作-这不是问题所在。有人从控制器的动作中想出了一个方法吗?

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

如果希望在新窗口中打开某个操作,则指向该操作的链接需要告知浏览器在单击时打开新窗口

伪示例:


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

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

  • 使用“_blank”属性装饰链接(使用HTML帮助器和直接HMTL语法的示例)

    • @Html.ActionLink(“linkText”,“Action”,new{controller=“controller”},new{target=“\u blank”})
  • 使用Javascript打开一个新窗口

    窗口。打开(“链接URL”)


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

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

    3) 在$.ajax请求的
    success
    (或者
    error
    !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(); }
            });            
        });      
    

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

    @using (Html.BeginForm("Action", "Controller", FormMethod.Get, new { target = "_blank" }))
    {
    //code
    }
    
    @Html.ActionLink(“linkText”,“Action”,new{controller=“controller”},new{target=“\u blank”,@class=“edit”})
    下面的脚本将在新窗口中打开操作视图url
    $(函数(){
    $('a.edit')。单击(函数(){
    var url=$(this.attr('href');
    打开(url,“popupWindow”,“宽度=600,高度=800,滚动条=yes”);
    });
    返回false;
    });   
    
    假设“NewWindow.cshtml”在您的“Home”文件夹中,我已经看到了在哪里可以执行类似的操作:

    如果您只想在选项卡中打开视图,可以使用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" />
    
    注意,这个JSON将覆盖上面的C#函数中的内容。我把它放在那里只是为了演示如何硬编码值

    (改编自)

    您可以按如下方式使用

    public ActionResult NewWindow()
    {
        return Content("<script>window.open('{url}','_blank')</script>");
    }
    
    public ActionResult NewWindow()
    {
    返回内容(“window.open({url},“\u blank”);
    }
    
    我在控制器中分配了javascript:

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

    @section Scripts{
        <script @Html.CspScriptNonce()>
    
        $(function () {
    
            @if (!String.IsNullOrEmpty(Model.linkCode))
            {
                WriteLiteral(Model.linkCode);
            }
        });
    
    @节脚本{
    $(函数(){
    @如果(!String.IsNullOrEmpty(Model.linkCode))
    {
    writeleral(Model.linkCode);
    }
    });
    
    这打开了一个带有链接的新选项卡,并转到它


    有趣的是,在本地运行时,它使用了一个弹出窗口拦截器,但在服务器上似乎工作得很好。

    如果我想从链接@Html.ActionLink(“linkText”、“Action”、“Controller”、new{target=“\u blank”}在新窗口中打开一个视图,我会使用它。尚未测试将控制器作为对象routeValue传递,为什么?但这不是问题。您确实回答了原始问题,但使用了“无法完成”,因此我将此标记为答案。@Joe-这只是我使用的Html.ActionLink重载中的选择,具有以下签名-Html.ActionLink(字符串链接文本、字符串操作、对象路由值、对象htmlAttributes)-但这只是个人选择,您可以使用任何接受htmlAttributes参数的重载。是否有方法定义新窗口的维度?(使用razor)@巴恩斯-我所知道的唯一一种让弹出窗口达到一定大小的方法是通过javascript。原因:大多数时候,浏览器都会决定如何处理窗口。javascript是整个web应用程序堆栈中唯一可以实际操作客户端浏览器的部分。这就是你所指的。如果你知道一个更好的方法。在我找到的所有可能的解决方案中,这是最好的,在我看来。这是最简单的,因为它使用MVC框架。默认提交操作是发布并提交以供最终操作。我们如何发布表单而不启动部分视图(在单独的窗口中)为了避免主窗口数据丢失。简单的场景就像主表单提交一样,提交用户选择的客户端临时保存的n个文件,并预览第一个。但是用户可能预览了某个文件,但仍然没有提交表单。在这种情况下,用户可能需要在新选项卡中查看该文件。那么,我们如何才能为一个表单提供两种POST方法具有不同视图的窗体。如果您知道请求应始终在新窗口中打开(仅限),则此操作非常有效。如果您可能在操作方法(典型为POST操作)的服务器端检测到错误,则您不希望返回的视图位于新选项卡中…您希望使用“返回视图(模型)”改为将错误添加到模型状态。如果对表单使用POST请求类型,请小心使用新窗口…AKS-使用单个POST,但向模型添加标识符,以便回发操作可以检测到您打算执行的操作,例如,SelectedAction枚举(或bool或…)。最好将GET和POST操作方法结合起来,即使POST-back本身可能重定向到其他操作。POST-controller方法的视图代码与从视图传递表单对象的submit操作是什么样的?上述操作默认为GET。如果必须使用POST进行操作,那么您将生成一个
    同样,这是一个前端解决方案,与后端无关。
    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)
    });
    
    public ActionResult NewWindow()
    {
        return Content("<script>window.open('{url}','_blank')</script>");
    }
    
    model.linkCode = "window.open('https://www.yahoo.com', '_blank')";
    
    @section Scripts{
        <script @Html.CspScriptNonce()>
    
        $(function () {
    
            @if (!String.IsNullOrEmpty(Model.linkCode))
            {
                WriteLiteral(Model.linkCode);
            }
        });