MVC 查询应从 ajax 部分视图返回结果或基于表单选项的 PDF 文档
本文关键字:表单 于表单 选项 文档 PDF ajax 查询 结果 返回 视图 MVC | 更新日期: 2023-09-27 18:32:03
我有一个页面,允许访问用户查询数据库并根据邮政编码返回信息。 我需要提供两个选项,一个用于显示嵌入在页面中的信息,另一个用于交替将信息作为 pdf 文档返回的选项。
我目前的解决方案是让一个 ajax 表单返回 PartViewResult,另一个表单返回 FileContentResult。
这行得通;但是,使用带有dropdown
指示是显示嵌入在页面中的信息还是生成为 pdf 文档的单个表单会更干净。 当页面是aspx
页面时,这就是我的编码方式,但是我一直无法弄清楚如何使用mvc
来做到这一点。
任何见解将不胜感激。
处理此客户端更容易,而不必管后端。 当选择获取 pdf 时(立即或在表单提交时),请选择返回 pdf 的 URL,不要将其作为 ajax 触发。 否则提交表单时,只需触发 ajax。
假设你使用的是jQuery,你可以做这样的事情:
<form class="my-form" action="/some-default">
<!-- all your form stuff -->
</form>
<select class="my-select">
<option value="/some-ajax-route" selected>Fire ajax on submit</option>
<option value="/some-pdf-route">Get pdf on submit</option>
</select>
$(".my-select").on("change", function(event) {
var selectListValue = $(this).val();
$(".my-form").attr("action", selectListValue);
});
因此,在对此进行了一些思考之后,我能够提出一个解决方案。 这就是我所做的。 我摆脱了用于将信息显示到文件的表单,并保留了用于进行 ajax 调用的表单,该表单返回嵌入在页面中的所需结果。 这允许我显示进度指示器(旋转图标与工作...text),同时查找信息并显示成功或失败消息。 然后,我创建了一个名为tofile.cshtml的部分视图。 对于 ajax 调用,我添加了一个 onSuccess 定义。 表单定义现在如下所示:
<pre>
@using (Ajax.BeginForm("tobrowser", new AjaxOptions {
HttpMethod = "GET",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "zipLookupResults",
OnBegin = "showProgress",
OnSuccess = "onSuccess",
OnComplete = "onComplete"
}))
{
....
}
</pre>
在控制器内部,我检查用户是否已选择在浏览器中显示信息或将其保存到文件中。 如果他们选择将其保存到文件,那么我将表单值保存到会话变量中并返回部分视图,指定使用 tofile 视图。
<pre>
if (model.ResultDestination.ToLower().Contains("file"))
{
Session["ZipCode"] = model.ZipCode;
Session["ResultDestination"] = model.ResultDestination;
Session["SortBy"] = model.SortBy;
return PartialView("tofile", model);
}
</pre>
tofile 视图只是定义一个 id/name 为 "tofile" 的隐藏输入字段。
然后我定义了一些javascript来处理ajax表单的onSuccess。 我寻找一个 id 为"tofile"的元素。 如果找到该对象,则重定向到控制器中的tofile方法。 我将以前保存的会话值保存回模型中,查找信息,格式化它并使用 FileContentResult 对象返回它。
<pre>
public FileContentResult tofile(ZipLookupModel model)
{
model.SortBy = Session["SortBy"].ToString();
model.ResultDestination = Session["ResultDestination"].ToString();
model.ZipCode = Session["ZipCode"].ToString();
model.WebResponse = WebService.ZipLookup(model.ZipCode, model.SortBy);
if (model.ResultDestination.Contains("CSVFile"))
{
return new FileContentResult(writeHamsToCSV(model).ToArray(), "text/csv");
}
else
{
return new FileContentResult(writeHamsToExcel(model).ToArray(), "application/vnd.ms-excel");
}
}
</pre>
像魅力一样工作! 现在继续添加其他格式。