有没有办法从控制器操作中打开一个视图在新窗口中?
public ActionResult NewWindow()
{
// some code
return View();
}
怎样才能使NewWindow.cshtml视图在一个新的浏览器标签中打开?
我知道如何在视图中的链接中实现它 - 这不是问题。但有没有人想到过从控制器操作中实现它的方法?
有没有办法从控制器操作中打开一个视图在新窗口中?
public ActionResult NewWindow()
{
// some code
return View();
}
怎样才能使NewWindow.cshtml视图在一个新的浏览器标签中打开?
我知道如何在视图中的链接中实现它 - 这不是问题。但有没有人想到过从控制器操作中实现它的方法?
这不能在控制器内部完成,而是需要在您的视图(View)中完成。 据我所见,你有两个选项:
使用"_blank"属性修饰您的链接(示例使用HTML助手和纯HTML语法)
@Html.ActionLink("链接文本", "Action", new {controller="Controller"}, new {target="_blank"})
<a href="@Url.Action("Action", "Controller")" target="_blank">链接文本</a>
使用Javascript打开新窗口
window.open("链接URL")
你也可以在表单中使用Tommy的方法:
@using (Html.BeginForm("Action", "Controller", FormMethod.Get, new { target = "_blank" }))
{
//code
}
<a href="NewWindow" target="_new">Click Me</a>
就是这样。将链接的目标设置为该操作即可。<form method="post" action="url" target="_new">
。但是需要注意的是,这只是前端解决方案,与后端无关。 - Eli Gassert你可以使用一些技巧来“模拟”你想要的效果:
1)通过ajax从视图中调用你的控制器。 2)返回你的视图。
3)在你的$.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(); }
});
});
public ActionResult NewWindow()
{
return Content("<script>window.open('{url}','_blank')</script>");
}
@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>
我在我的控制器中分配了Javascript:
model.linkCode = "window.open('https://www.yahoo.com', '_blank')";
在我看来:
@section Scripts{
<script @Html.CspScriptNonce()>
$(function () {
@if (!String.IsNullOrEmpty(Model.linkCode))
{
WriteLiteral(Model.linkCode);
}
});
这将打开一个带有链接的新标签页,并跳转到它。
有趣的是,本地运行时它会触发弹出窗口拦截器,但在服务器上似乎可以正常工作。
我曾看到过这样的操作,假设"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)
});