如何防止控制器更改视图
How to prevent controller from changing the View
我是 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");
}
您正在服务器端代码中进行重定向。
对您的 MVC 控制器进行 AJAX 调用(如果它是 Web API 控制器则更好)并从控制器 return HTTP OK / HTTP Accepted。在单击按钮时使用 JavaScript/jQuery 进行 AJAX 调用时,以这种方式防止按钮的默认行为(提交表单):
function onButtonClickPdfExportToServerUsingAjax(e){
e.PreventDefault();
// AJAX call
}
收到成功的AJAX呼叫响应后,继续下一步。
您可以尝试 return 模型索引操作,如下所示:
[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) {
}
});
}
我是 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");
}
您正在服务器端代码中进行重定向。
对您的 MVC 控制器进行 AJAX 调用(如果它是 Web API 控制器则更好)并从控制器 return HTTP OK / HTTP Accepted。在单击按钮时使用 JavaScript/jQuery 进行 AJAX 调用时,以这种方式防止按钮的默认行为(提交表单):
function onButtonClickPdfExportToServerUsingAjax(e){
e.PreventDefault();
// AJAX call
}
收到成功的AJAX呼叫响应后,继续下一步。
您可以尝试 return 模型索引操作,如下所示:
[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) {
}
});
}