MVC 查询应从 ajax 部分视图返回结果或基于表单选项的 PDF 文档



我有一个页面,允许访问用户查询数据库并根据邮政编码返回信息。 我需要提供两个选项,一个用于显示嵌入在页面中的信息,另一个用于交替将信息作为 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>

像魅力一样工作! 现在继续添加其他格式。

最新更新