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的优势所在——将代码/概念与视图分离 如果希望在新窗口中打开某个操作,则指向该操作的链接需要告知浏览器在单击时打开新窗口 伪示例:
这就是全部。设置指向该操作的链接目标。这不能从控制器本身内部完成,而是从您的视图完成。在我看来,你有两个选择:
@Html.ActionLink(“linkText”,“Action”,new{controller=“controller”},new{target=“\u blank”})
窗口。打开(“链接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);
}
});