web-dev-qa-db-fra.com

Ouvrir mvc voir dans une nouvelle fenêtre du contrôleur

Est-il possible d'ouvrir une vue à partir d'une action du contrôleur dans une nouvelle fenêtre?

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

Comment faire pour que la vue NewWindow.cshtml s'ouvre dans un nouvel onglet de navigateur?

Je sais comment le faire à partir d'un lien dans la vue - ce n'est pas la question. Quelqu'un at-il trouvé un moyen de le faire à partir de l'action du contrôleur ?

47
Joe

Vous pouvez également utiliser la méthode de Tommy dans les formulaires:

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

Vous posez la mauvaise question. Le codebehind (contrôleur) n'a rien à voir avec ce que fait le frontal. En fait, c’est la force de MVC: vous séparez le code/concept de la vue.

Si vous souhaitez qu'une action s'ouvre dans une nouvelle fenêtre, les liens vers cette action doivent indiquer au navigateur d'ouvrir une nouvelle fenêtre lorsque l'utilisateur clique dessus.

Un pseudo exemple: <a href="NewWindow" target="_new">Click Me</a>

Et c'est tout ce qu'il y a à faire. Définissez la cible des liens vers cette action.

7
Eli Gassert

Oui, vous pouvez faire des travaux difficiles pour simuler ce que vous voulez:

1) Appelez votre contrôleur depuis une vue en ajax . 2) Renvoyez votre vue

3) Utilisez quelque chose comme ceci dans la section success (ou peut-être error! Error me convient!) De votre requête $ .ajax

$("#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(); }
        });            
    });      
3
Amin Saqi

J'ai vu où vous pouvez faire quelque chose comme ceci, en supposant que "NewWindow.cshtml" se trouve dans votre dossier "Accueil":

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));

ou 

return Content("/Home/NewWindow");

Si vous souhaitez simplement ouvrir des vues dans des onglets, vous pouvez utiliser des événements de clic JavaScript pour rendre vos vues partielles. Ce serait votre méthode de contrôleur pour 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);
}

Votre balisage sur votre page appelle ceci:

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

Et le JavaScript (nécessite 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)
});

Notez que ce JSON écraserait le contenu de la fonction C # ci-dessus. J'y ai eu à des fins de démonstration sur la façon de coder en dur les valeurs, uniquement.

(Adapté de Rendu d'une vue partielle sur un clic de bouton dans ASP.NET MVC )

0
vapcguy
@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>
0
Prasanta