【问题标题】:How to prevent controller from changing the View如何防止控制器更改视图
【发布时间】:2022-01-27 03:41:37
【问题描述】:

我是 MVC 的新手,目前我正在尝试为我的表单创建一个函数,将其值导出为 PDF。我设法使用带有调用控制器的提交类型的输入来做到这一点。 我的问题是当我想保留表单中的值时(因为我想创建另一个将表单作为电子邮件发送的按钮),但单击按钮后表单会重置。 我尝试创建 void 函数而不是操作结果,但在调用之后,浏览器尝试重定向到另一个页面,控制器名称为 URL。 我也尝试将输入类型从提交更改为按钮,但更改后,它不会在单击时调用控制器。 所以我的问题是,如何在不导致表单重置其值的情况下调用控制器。

这里是调用控制器的 index.cshtml

  <div class="row clearfix">
        <div class="input-group">
            <input id="pdfBtn" value="Export to pdf" type="submit" formaction="@Url.Action("pdfExport")" />
        </div>
    </div>

这里是控制器

        [HttpPost]
        public ActionResult pdfExport([Bind(Include = "formId,formType,additionalTypeInfo,nameSurname,description,Attachment")] FormModel model)
        {
            if (ModelState.IsValid)
            {
                var pdf = new FormToPdf(model);
            }
            return RedirectToAction("Index");
        }

【问题讨论】:

  • 我不明白。你到底想要什么。如果您想让视图不刷新,您可以使用 Jquery Ajax。如果您将任何内容重定向到任何视图,它将刷新页面或视图。
  • 我想在用户点击“导出为 pdf”按钮后导出用户输入的值,但同时我不想丢失他已经输入的值

标签: c# asp.net-mvc asp.net-core razor


【解决方案1】:

您可以尝试像这样将模型返回到索引操作:

[HttpPost]
        public ActionResult pdfExport([Bind(Include = "formId,formType,additionalTypeInfo,nameSurname,description,Attachment")] FormModel [HttpPost]
        public ActionResult pdfExport([Bind(Include = "formId,formType,additionalTypeInfo,nameSurname,description,Attachment")] FormModel model)
        {
            if (ModelState.IsValid)
            {
                var pdf = new FormToPdf(model);
            }
            return RedirectToAction("Index");
        })
        {
            if (ModelState.IsValid)
            {
                var pdf = new FormToPdf(model);
            }
            return RedirectToAction("Index",model);
        }

或者你可以在按钮点击时使用ajax传递数据,这样页面就不会刷新:

<input id="pdfBtn" value="Export to pdf" type="button" onclick="pdfExport()"/>

js:

function pdfExport() {
            $.ajax({
                type: "POST",
                url: "pdfExport",
                data: Data,
                success: function (data) {
                }

            });
        }

【讨论】:

  • 感谢帮助,Ajax 似乎可以解决问题。
  • 如果我的回答有帮助,你能接受吗?谢谢。
【解决方案2】:

您正在服务器端代码中进行重定向。

对您的 MVC 控制器进行 AJAX 调用(如果它是 Web API 控制器则更好)并从控制器返回 HTTP OK / HTTP Accepted。在单击按钮时使用 JavaScript/jQuery 进行 AJAX 调用时,请防止按钮的默认行为(提交表单),如下所示:

function onButtonClickPdfExportToServerUsingAjax(e){ 
   e.PreventDefault(); 
   // AJAX call
}

收到成功的 AJAX 调用响应后,继续进行下一步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多