Подтвердить что ты не робот

Открыть mvc в новом окне от контроллера

Есть ли способ открыть представление из действия контроллера в новом окне?

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

Как я могу открыть представление NewWindow.cshtml на новой вкладке браузера?

Я знаю, как это сделать из ссылки в представлении - это не вопрос. Кто-нибудь понял способ сделать это из действия контроллера?

4b9b3361

Ответ 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>
  • Использование Javascript для открытия нового окна

    window.open("Link URL")

Ответ 2

Вы также можете использовать метод Томми в формах:

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

Ответ 3

Вы задаете неправильный вопрос. Codebehind (controller) не имеет никакого отношения к тому, что делает frontend. На самом деле, что сила MVC - вы отделяете код/​​концепцию от представления.

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

Псевдо пример: <a href="NewWindow" target="_new">Click Me</a>

И все это к нему. Задайте ссылку на это действие.

Ответ 4

Да, вы можете сделать несколько сложных работ для симулировать то, что вы хотите:

1) Вызовите своего контроллера из вида ajax. 2) Верните свой просмотр

3) В success (или, возможно, error! ошибка работает для меня!) в вашем запросе $.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(); }
        });            
    });      

Ответ 5

@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>

Ответ 6

Я видел, где вы можете сделать что-то вроде этого, предполагая, что "NewWindow.cshtml" находится в вашей "Домашней" папке:

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 перезапишет то, что находится в этой функции С# выше. У меня это было для демонстрации того, как вы можете жестко кодировать значения.

(Адаптировано из частичного рендеринга при нажатии кнопки в ASP.NET MVC)

Ответ 7

Вы можете использовать следующим образом

public ActionResult NewWindow()
{
    return Content(<script>window.open('{url}','_blank')</script>");
}