C# MVC查询应该根据表单选项从ajax局部视图或PDF文档返回结果

C# MVC查询应该根据表单选项从ajax局部视图或PDF文档返回结果,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个页面,允许访问用户查询数据库并返回基于zipcode的信息。我需要提供两个选项,一个用于显示页面中嵌入的信息,另一个用于交替返回pdf文档中的信息 我当前的解决方案是使用一个ajax表单返回PartialViewResult,另一个表单返回FileContentResult 这是有效的;但是,如果有一个带有下拉列表的单一表单,它将更加简洁,指示是显示嵌入页面中的信息还是生成为pdf文档。这就是我在页面是aspx页面时对其进行编码的方式,但我一直无法找到如何使用mvc进行编码 <pr

我有一个页面,允许访问用户查询数据库并返回基于zipcode的信息。我需要提供两个选项,一个用于显示页面中嵌入的信息,另一个用于交替返回pdf文档中的信息

我当前的解决方案是使用一个ajax表单返回PartialViewResult,另一个表单返回FileContentResult

这是有效的;但是,如果有一个带有
下拉列表的单一表单,它将更加简洁,指示是显示嵌入页面中的信息还是生成为pdf文档。这就是我在页面是
aspx
页面时对其进行编码的方式,但我一直无法找到如何使用
mvc
进行编码

<pre>
@using (Ajax.BeginForm("tobrowser", new AjaxOptions {
      HttpMethod = "GET",
      InsertionMode = InsertionMode.Replace,
      UpdateTargetId = "zipLookupResults",
      OnBegin = "showProgress",
      OnSuccess = "onSuccess",
      OnComplete = "onComplete"
}))
{

    ....
}
</pre>
<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>

如果您有任何见解,我们将不胜感激。

处理此客户端更容易,后端也更容易处理。当选择获取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
提交时获取pdf
$(.my select”)。在(“更改”上,函数(事件){
var selectListValue=$(this.val();
$(“.my form”).attr(“action”,selectListValue);
});

所以在思考了一下之后,我终于想出了一个解决方案。这就是我所做的。我去掉了用于将信息显示到文件中的表单,保留了用于进行ajax调用并返回嵌入到页面中所需结果的表单。这使我能够在查找信息和显示成功或失败消息时显示进度指示器(旋转图标和工作…文本)。然后我创建了一个名为tofile.cshtml的局部视图。在ajax调用中,我添加了一个onSuccess定义。表单定义现在如下所示:

<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.BeginForm(“tobrowser”),新的AjaxOptions{
HttpMethod=“GET”,
InsertionMode=InsertionMode.Replace,
UpdateTargetId=“zipLookupResults”,
OnBegin=“showProgress”,
OnSuccess=“OnSuccess”,
OnComplete=“OnComplete”
}))
{
....
}
在控制器内部,我检查用户是否选择在浏览器中显示信息或将其保存到文件中。如果他们选择将其保存到文件,那么我将表单值保存到会话变量中,并返回部分视图,指定使用tofile视图


if(model.ResultDestination.ToLower().Contains(“文件”))
{
会话[“ZipCode”]=model.ZipCode;
会话[“ResultDestination”]=model.ResultDestination;
会话[“SortBy”]=model.SortBy;
返回部分视图(“tofile”,模型);
}
tofile视图仅定义一个id/名称为“tofile”的隐藏输入字段

然后我定义了一些javascript来处理ajax表单的成功。我查找id为“tofile”的元素。如果找到该对象,则重定向到控制器内的tofile方法。我将以前保存的会话值保存回模型中,查找信息,格式化并使用FileContentResult对象返回


public FileContentResult-tofile(ZipLookupModel模型)
{
model.SortBy=Session[“SortBy”].ToString();
model.ResultDestination=会话[“ResultDestination”].ToString();
model.ZipCode=Session[“ZipCode”].ToString();
model.WebResponse=WebService.ZipLookup(model.ZipCode,model.SortBy);
if(model.ResultDestination.Contains(“CSVFile”))
{
返回新的FileContentResult(writeHamsToCSV(model).ToArray(),“text/csv”);
}
其他的
{
返回新的FileContentResult(writeHamsToExcel(model.ToArray(),“application/vnd.ms excel”);
}
}

工作起来很有魅力!现在开始添加其他格式。

您是否被困在如何创建一个根据单选按钮执行两种不同操作的页面上,或者被困在如何创建一个返回
PartialViewResult
FileContentResult
的控制器方法上?如何根据单选按钮执行两种不同的操作。我实际上使用的是一个下拉列表,但也是一样的。还要注意的是,数据在不断变化,所以pdf文档是动态创建的。你能提供一些这样做的示例代码吗?当用户单击submit按钮时,我如何不启动ajax并将字段数据发布到返回pdf的url?谢谢您的帮助。这看起来很有希望,但也有我一直在努力解决的问题。如果我将其设置为ajax调用,则pdf将嵌入页面中,而不是被视为可以下载或保存的pdf。如果我将其设置为普通表单,则pdf可以正常工作,但html显示为其自己的页面,而不是嵌入母版页中。在这件事上有什么明显的遗漏吗?再次感谢。请拍摄正在发生的事情的屏幕截图,然后制作第二张您希望发生的事情的图像,我们会为您解决。这里是相关页面的链接:。我想要相同的功能,但是使用一个组合的单一表单,“下载结果到”下拉列表中的一个选项是在页面上显示信息,就像“在浏览器中显示”表单一样。因此,信息要么嵌入在主控形状内的页面上,要么弹出一个对话框询问用户是否要保存或打开数据。