显示带有 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");
}