1

我有一个由 javascript 动态加载的标记对象。此标签在 jquery 发布后加载:

$.post('@Url.Action("ShowCredential", "ManageCredentials")',  
    $(form).serialize(), function(url) { 
    document.getElementById("credential_preview").innerHTML = "<object id='credencial_atual' type='application/pdf' classid='clsid:CA8A9780-280D-11CF-A24D-444553540000' width='250' height='420' style='border: 1px solid'> <param name='src' value='" + url + "#navpanes=0&scrollbar=0&zoom=100%' /></object>"; 

    $("#preview_popup").show(); 
}); 

Obs:我用我的表单加载表单变量。

在我的操作“ShowCredential”的代码隐藏中,我在 byte[] 中加载一个 pdf 并存储在我的用户会话中:

[HttpPost] 
public string ShowCredential(/* the attributes to help to load the pdf */) 
{ 
    // Loading my pdf... 
    Session.User.CurrentPDF = // set the pdf loaded 

    UrlHelper urlHelper = new UrlHelper(this.ControllerContext.RequestContext); 
    string url = urlHelper.Action("GetPDF", "ManageCredentials"); 

    return url; 
}

该 url 是使用将返回 pdf 的操作生成的。

[HttpGet] 
public FileResult GetPDF() 
{ 
    return File(Session.User.CurrentPDF, "application/pdf"); 
} 

所以,在第一次,好的,加载了正确的pdf,但是在第二次,第三次......加载了相同的pdf,为什么?(我检查了我是否通过了正确的参数,是的,我通过了=))

Obs:当我发布数据以加载 pdf 后,在 jquery 返回之后,我的代码第一次调用动作 GetPDF,但是,当我再次发布时,不再调用动作 GetPDF。

4

3 回答 3

1

维尼修斯

希望以下内容对您有所帮助。在我的一个应用程序中,我必须显示文字文档、pdf、图像或任何其他类型的文档。我很欣赏这不是通过 ajax 本身要求的,但可以让您考虑替代解决方案。下面的代码实现了这一点(忽略对象模型,而是特别检查 switch 语句):

public ActionResult DownloadFile(int fileID, int propertyId)
{
    var item = _tasks.GetByKey(fileID);

    if (item.PropertyEntity.PropertyID == propertyId)
    {
        string docType = item.FileName.Substring(item.FileName.IndexOf(".") + 1);
        switch (docType.ToLower())
        {
            case "doc":
                docType = "application/msword";
                break;
            case "jpg":
                docType = "image/jpeg";
                break;
            default:
                // i.e. do nothing else - this may change
                docType = "application/" + docType;
                break;
        }

        string doc = item.DocumentLocation.Replace("..", "~");
        return File(doc, docType);
    }
    else
    {
        return View("NotFound");
    }
}

当然,结果不会显示在视图中,因为需要适当的“应用程序”来显示每个结果,因此在您的情况下会打开 Adob​​e PDFReader。

于 2012-02-09T13:24:39.383 回答
1

你的代码看起来很奇怪。您正在向某个控制器操作发送 POST AJAX 请求,但您似乎没有在成功回调中使用结果(dados变量)做任何事情。此外,您似乎VisualizarCredencial两次调用该操作:一次用于 AJAX 请求,一次用于呈现 PDF。

您还没有解释您的意图,所以我只能猜测您要做什么,我的猜测是您可能有 2 个控制器操作:一旦返回可用于查询第二个控制器操作的 url 或 id这将返回pdf。

像这样:

[HttpPost]
public ActionResult VisualizarCredencial()
{
    // some id of the pdf
    return Json(new { url = Url.Action("GetPdf", "GerenciarCredenciais", new { id = "123" }) });
}

public ActionResult GetPdf(int id)
{
    byte[] pdf = ... 
    return File(pdf, "application/pdf");
}

现在在客户端上,您可以使用 iframe:

var url = '@Url.Action("VisualizarCredencial", "GerenciarCredenciais")';
$.post(url, function(result) {
    $('#preview_credencial').html(
        $('<iframe/>', {
            'class': 'pdfpreview', // some CSS class to set the width and height of the preview iframe
            'src': result.url
        })
    );
});

并且为了避免动作的潜在缓存问题,您可以使用自定义动作过滤器GepPdf来装饰它。[NoCache]

于 2012-02-10T12:26:31.930 回答
0

寻找答案,我得出以下结论:所以,如果我们使用 form.submit() 那么控制器只返回一个文件结果。如果我们使用 ajax 传递数据,我们无法返回 pdf,但必须返回您在 get(例如 href)上传递的内容,该 get(例如 href)将返回 pdf。

于 2012-02-09T16:58:04.507 回答