显示带有 MVC 的弹出窗口 Windows,JavaScript
Showing Popup Windows with MVC, JavaScript
我在 MVC 4 中有一个简单的创建表单,想要两个提交功能:(1) 创建和 (2) 创建并打印。 Create 是一个正常的 Create 动作并且运行良好。 Create & Print 应保存对象,然后使用新保存对象的数据启动弹出浏览器 window。原来的 window 需要刷新为空白的创建表单,为另一条记录做好准备。
解决这个问题的最佳方法是什么?
下面是一个在实践中有效的示例,但是我将 ID 硬编码在其中。理想情况下,此 ID 将从刚刚保存的对象和 link 那里动态继承。 JavaScript 是这里最好的主意还是我应该(可以)从控制器启动弹出窗口?
<input type="submit" value="Create" />
<input type="submit"
value="Create & Print"
onclick="window.open('Print/f1ad6330-2978-4ea9-9116-65f861412260'
, 'PRINT'
, 'height=200,width=200');" />
最好的选择是创建另一个操作,其中 returns string (last-insert-id), post 数据通过 ajax 返回 last-insert-id在 javascript 然后你可以用它来打开新的 window。
现在假设这是新的控制器操作:
[HttpPost]
public string CreateAndPrint(Object obj)
{
// Save data here / insert record here
if (Request.IsAjaxRequest())
{
// Now get last insert id
string lastInsertId = db.GetLastInsertId; // get last insert id from database
return lastInsertId;
}
}
有一个javascript函数来post数据:
<script type="text/javascript">
function creteAndPrint() {
$.ajax(
{
url : "CreateAndPrint",
type: "POST",
data : $("#from1").serialize(),
success:function(data)
{
var lastInsId = data; // you will get last insert id here.
var secWin = window.open('Print/'+lastInsId
, 'PRINT'
, 'height=200,width=200');
secWin.focus();
}
});
}
</script>
并且仅在创建和打印按钮上调用此函数:
<input type="submit" value="Create & Print" onclick="creteAndPrint();" />
希望对你有用。谢谢。
在这里,我正在根据您的评论编辑我的答案:)
是的!您可以调用相同的 Create
操作来实现我上面解释的相同操作。但是为此,您必须对 Create
操作进行一些更改:
public string Create(Object obj)
{
// Save data here / insert record here
if (Request.IsAjaxRequest())
{
// Now get last insert id
string lastInsertId = db.GetLastInsertId; // get last insert id from database
return PartialView("_Create", lastInsertId);
}
return View();
}
请注意,当您通过 AJAX 调用此操作时,它将 return 一个部分视图,return 只是 LAST_INSERT_ID 作为字符串。您只需创建一个简单的局部视图 _Create
来打印最后插入的 ID。
部分视图将只有两行:
@model string
@Model
这将打印我们从控制器操作传递的 last-inst-id。
我最终绕过了表单对 Create 方法的默认提交调用,并创建了两个新方法。这并不理想,但它确实有效。
解决方案
表格:
@using (Html.BeginForm("Dummy", "Count", FormMethod.Post, new { id = "form1" }))
{
// My Form
// Note the Dummy controller which will just fall through and do nothing
}
表单提交:
<input type="submit" value="Create & Print" onclick="createAndPrint();" />
<input type="submit" value="Create" onclick="createWithoutPrinting();" />
JavaScript:
<script type="text/javascript">
function createAndPrint() {
$.ajax(
{
url: "CreateAndPrint",
type: "POST",
data: $("#form1").serialize(),
success: function (data) {
var lastInsId = data; // you will get last insert id here.
var secWin = window.open('Print/' + lastInsId
, 'PRINT'
, 'height=450,width=230');
secWin.focus();
}
});
}
</script>
<script type="text/javascript">
function createWithoutPrinting() {
$.ajax(
{
url: "Create",
type: "POST",
data: $("#form1").serialize()
});
}
</script>
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Dummy(Count count)
{
return RedirectToAction("Create");
}
[HttpPost]
public string CreateAndPrint(Count count)
{
SaveCount(count);
if (Request.IsAjaxRequest())
{
// Now get last insert id
string lastInsertId = count.Id.ToString();
return lastInsertId;
}
return "";
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Count count)
{
SaveCount(count);
if (Request.IsAjaxRequest())
{
// Now get last insert id
string lastInsertId = count.Id.ToString();
return PartialView("_Create", lastInsertId);
}
return RedirectToAction("Create");
}
我在 MVC 4 中有一个简单的创建表单,想要两个提交功能:(1) 创建和 (2) 创建并打印。 Create 是一个正常的 Create 动作并且运行良好。 Create & Print 应保存对象,然后使用新保存对象的数据启动弹出浏览器 window。原来的 window 需要刷新为空白的创建表单,为另一条记录做好准备。
解决这个问题的最佳方法是什么?
下面是一个在实践中有效的示例,但是我将 ID 硬编码在其中。理想情况下,此 ID 将从刚刚保存的对象和 link 那里动态继承。 JavaScript 是这里最好的主意还是我应该(可以)从控制器启动弹出窗口?
<input type="submit" value="Create" />
<input type="submit"
value="Create & Print"
onclick="window.open('Print/f1ad6330-2978-4ea9-9116-65f861412260'
, 'PRINT'
, 'height=200,width=200');" />
最好的选择是创建另一个操作,其中 returns string (last-insert-id), post 数据通过 ajax 返回 last-insert-id在 javascript 然后你可以用它来打开新的 window。 现在假设这是新的控制器操作:
[HttpPost]
public string CreateAndPrint(Object obj)
{
// Save data here / insert record here
if (Request.IsAjaxRequest())
{
// Now get last insert id
string lastInsertId = db.GetLastInsertId; // get last insert id from database
return lastInsertId;
}
}
有一个javascript函数来post数据:
<script type="text/javascript">
function creteAndPrint() {
$.ajax(
{
url : "CreateAndPrint",
type: "POST",
data : $("#from1").serialize(),
success:function(data)
{
var lastInsId = data; // you will get last insert id here.
var secWin = window.open('Print/'+lastInsId
, 'PRINT'
, 'height=200,width=200');
secWin.focus();
}
});
}
</script>
并且仅在创建和打印按钮上调用此函数:
<input type="submit" value="Create & Print" onclick="creteAndPrint();" />
希望对你有用。谢谢。
在这里,我正在根据您的评论编辑我的答案:)
是的!您可以调用相同的 Create
操作来实现我上面解释的相同操作。但是为此,您必须对 Create
操作进行一些更改:
public string Create(Object obj)
{
// Save data here / insert record here
if (Request.IsAjaxRequest())
{
// Now get last insert id
string lastInsertId = db.GetLastInsertId; // get last insert id from database
return PartialView("_Create", lastInsertId);
}
return View();
}
请注意,当您通过 AJAX 调用此操作时,它将 return 一个部分视图,return 只是 LAST_INSERT_ID 作为字符串。您只需创建一个简单的局部视图 _Create
来打印最后插入的 ID。
部分视图将只有两行:
@model string
@Model
这将打印我们从控制器操作传递的 last-inst-id。
我最终绕过了表单对 Create 方法的默认提交调用,并创建了两个新方法。这并不理想,但它确实有效。
解决方案
表格:
@using (Html.BeginForm("Dummy", "Count", FormMethod.Post, new { id = "form1" }))
{
// My Form
// Note the Dummy controller which will just fall through and do nothing
}
表单提交:
<input type="submit" value="Create & Print" onclick="createAndPrint();" />
<input type="submit" value="Create" onclick="createWithoutPrinting();" />
JavaScript:
<script type="text/javascript">
function createAndPrint() {
$.ajax(
{
url: "CreateAndPrint",
type: "POST",
data: $("#form1").serialize(),
success: function (data) {
var lastInsId = data; // you will get last insert id here.
var secWin = window.open('Print/' + lastInsId
, 'PRINT'
, 'height=450,width=230');
secWin.focus();
}
});
}
</script>
<script type="text/javascript">
function createWithoutPrinting() {
$.ajax(
{
url: "Create",
type: "POST",
data: $("#form1").serialize()
});
}
</script>
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Dummy(Count count)
{
return RedirectToAction("Create");
}
[HttpPost]
public string CreateAndPrint(Count count)
{
SaveCount(count);
if (Request.IsAjaxRequest())
{
// Now get last insert id
string lastInsertId = count.Id.ToString();
return lastInsertId;
}
return "";
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Count count)
{
SaveCount(count);
if (Request.IsAjaxRequest())
{
// Now get last insert id
string lastInsertId = count.Id.ToString();
return PartialView("_Create", lastInsertId);
}
return RedirectToAction("Create");
}