首页 > 解决方案 > 使用.Net Core MVC,如何将提交“按钮”的值传递给控制器​​,同时有一个确认对话框?

问题描述

我的问题似乎有点典型,但解决起来过于困难。基本上,我有一个带有两个提交按钮的表单。一个用于“保存”,一个用于“提交”。我还希望用户在继续提交之前得到一个确认对话框。下面是我所做的一个例子。

看法:

<form asp-action="Save">
<input type="submit" name="submitType" value="Save" class="btn btn-primary" />
<input type="submit" name="submitType" value="Submit" class="btn btn-primary" />
</form>
<script type="text/javascript">
        $(document).ready(function () {
            $( "form" ).submit(function (e) {
                e.preventDefault();
                var submitClicked = $("input[type=submit][clicked=true]").val();
                if ($(this).valid()) {
                    if (submitClicked == "Save") {
                        $("form").unbind('submit').submit();
                    }

                    if (submitClicked == "Submit") {
                        if (confirm("Are you sure you are ready to Submit your document for Approval?")) {
                            $("form").unbind('submit').submit();
                        }
                    }
                }
            });
            $("form input[type=submit]").click(function () {
                $("input[type=submit]", $(this).parents("form")).removeAttr("clicked");
                $(this).attr("clicked", "true");
            });
        });
</script>

控制器:

[HttpPost]
public async Task<IActionResult> Save(Document document, string submitType)
{
     if (submitType == "Submit")
     {
          document.ApprovalLevel = 1;
     }
}

现在确认工作没有缺陷,但由于某种原因,当使用 preventDefault() 和 unbind().submit() 时,它删除了提交按钮的输入值,所以我在控制器中得到了 submitType 的空值,因此提交失败。当我删除提出确认问题的 jquery 位时,提交按钮的输入值不会失败。如何在仍然知道使用哪个按钮提交给控制器的情况下实现确认问题有效的解决方案。

编辑(基于 Chris Pratt 的简单解释的解决方案):

看法:

<form asp-action="Save">
//ADDED Hidden Input Parameter
<input type="hidden" id="submitForApproval" name="submitForApproval" value="false" />
<input type="submit" name="submitType" value="Save" class="btn btn-primary" />
<input type="submit" name="submitType" value="Submit" class="btn btn-primary" />
</form>
<script type="text/javascript">
        $(document).ready(function () {
            $( "form" ).submit(function (e) {
                e.preventDefault();
                var submitClicked = $("input[type=submit][clicked=true]").val();
                if ($(this).valid()) {
                    if (submitClicked == "Save") {
                    //ADDED jquery update to hidden input parameter
                        $('#submitForApproval').val(false);
                        $("form").unbind('submit').submit();
                    }

                    if (submitClicked == "Submit") {
                        if (confirm("Are you sure you are ready to Submit your document for Approval?")) {
                            //ADDED jquery update to hidden input parameter
                            $('#submitForApproval').val(true);
                            $("form").unbind('submit').submit();
                        }
                    }
                }
            });
            $("form input[type=submit]").click(function () {
                $("input[type=submit]", $(this).parents("form")).removeAttr("clicked");
                $(this).attr("clicked", "true");
            });
        });
</script>

标签: javascriptjqueryasp.net-core

解决方案


提交按钮的值只有在实际提交表单时才会进入请求。在这里,您将停止原始提交,然后稍后手动提交,此时按钮不再负责,因此不会发送其值。

您最好的选择,因为无论如何您都在这里使用 JS,所以设置一个隐藏字段,其中包含单击时的值。


推荐阅读