从控制器操作将pdf嵌入到视图中

时间:2012-08-18 03:45:35

标签: asp.net-mvc pdf

我有一个简单的Controller Action,它将pdf作为FileContentResult返回。我想将pdf嵌入到一个新窗口中,并在视图中添加一些其他html元素,如按钮。我已经尝试静态插入一个对象标签,然后动态设置指向我的控制器动作网址的数据属性。这什么都不做。我也尝试过使用PDFObject基本上做同样的事情,但这也不起作用(虽然奇怪的是,提琴手说我找不到我的动作方法,虽然我之前在同一页面上使用过它)。我怀疑,因为没有任何东西与对象标签交互,所以它们永远不会触发url中的动作。如何在采用动态生成的参数的mvc操作中指向渲染的pdf文件?现在我也没有例外。

// My controller 
    [HttpGet] 
    public ActionResult GetReportFile(string pReportType, string pK2ID, DateTime pPeriodRun) 
    { 
        return new FileContentResult(DataModel.KrisReportDataModelProp.GetReportFile(pReportType, pK2ID, DateTime.MinValue), "application/pdf") { FileDownloadName = "test.pdf" }; 
    } 

// My javascript 
var pdfReportResult = new PDFObject({ 
                            url: '../../KrisReport/GetReportFile?pReportType=' + lReportTypeSubmissionQuerySelector.val() + '&pK2ID=' + lK2ID + '&pPeriodRun=' + lPeriodRun 
                        }).embed('reportPlaceHolder');

1 个答案:

答案 0 :(得分:0)

就在最近,当我不得不提交表单,验证表单以及它是否有效时,我遇到了一个问题,向用户提供了下载pdf文件的选项。请注意,下载pdf文件是可选的。用户需要单击“下载Pdf”按钮,该按钮在初始表单验证之前不可用。这听起来像你的问题类似的东西。 我通过以下方式实现了这一目标:

查看型号:

public class PatientModel
{
    public int id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public byte[] PdfByteArray { get; set; }
}

控制器上的操作:

// Action to display initial form
[HttpGet]
public ActionResult CreatePatient()
{
    PatientModel model = new PatientModel();
    return View(model);
}

// Action to post patient
[HttpPost]
public ActionResult CreatePatient(PatientModel model)
{
    if(ModelState.IsValid)
    {
        // whatever logic to save new patient
        mPatient.Save(model);

        // whatever logic to generate pdf byte[]. I have a helper for this.
        string html = "[some html based on which a pdf will be generated]"
        byte[] pdf = PDFHelper.GeneratePDFFromContents(html);
        model.PdfByteArray = pdf;
    }

    return View(model);
}

// action to download PDF file given byte[]
[HttpPost]
public ActionResult PdfFromByteArray(byte[] pdfByteArray)
{
    return File(pdfByteArray, "application/pdf", "MyHistory.pdf");
}

查看:

@model PatientModel
@using (Html.BeginForm())
{
    First Name: @Html.TextBoxFor(x => x.FirstName)
    Last Name: @Html.TextBoxFor(x => x.LastName)
    @html.ValidationSummary()
    <input type="submit" value="Submit" />
}

@if (ViewData.ModelState.IsValid)
{
    using (Html.BeginForm("PdfFromByteArray", "[Controller Name]"))
    {
        @Html.HiddenFor(x => x.PdfByteArray)
        <input type="submit" value="Download File" />
    }
}

如果初始形式有效,我将pdf的字节数组作为隐藏输入嵌入到视图中。如果用户请求下载pdf(使用该隐藏输入提交第二个表单),则会调用另一个从byte []生成pdf的操作并将其返回。