0

我有一个简单的控制器操作,它返回一个 pdf 作为 FileContentResult。我想将 pdf 嵌入到一个新窗口中,并在视图中添加一些其他 html 元素,如按钮。我尝试静态插入一个对象标记,然后动态设置指向我的控制器操作 url 的数据属性。这根本没有任何作用。我也尝试过使用 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');
4

1 回答 1

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 并返回它的操作。

于 2012-11-20T19:42:35.253 回答