Мое действие Asp.NET HttpGet (которое возвращает FileResult) вызывается только один раз в src тега объекта после поста jquery - PullRequest
1 голос
/ 09 февраля 2012

У меня есть объект тега, который динамически загружается с помощью 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" я загружаю 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 return - мой код вызывает действие GetPDF в первый раз, но, когда я снова публикую сообщение, действие GetPDF больше не вызывается.

Ответы [ 3 ]

1 голос
/ 10 февраля 2012

Ваш код кажется странным.Вы отправляете запрос POST AJAX для какого-либо действия контроллера, но, похоже, вы ничего не делаете в обратном вызове успеха с результатом (переменная dados).Также вы, кажется, вызываете действие VisualizarCredencial дважды: один раз для запроса AJAX и один раз для рендеринга PDF.

Вы не объяснили свои намерения, поэтому я могу только догадываться, что вы пытаетесь сделать, и я предполагаю, что у вас может быть 2 действия контроллера: один раз, который возвращает URL или идентификатор, который может быть использован для запроса второго действия контроллера, которое возвратит 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, вы можете украсить его с помощью custom [NoCache] фильтр действий.

1 голос
/ 09 февраля 2012

Виниций,

Надеюсь, вам поможет следующее.В одном из моих приложений я должен отображать либо слово документ, 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");
    }
}

Конечно, результат не отображается внутри представления, так как требуется соответствующее «приложение»для отображения каждого, таким образом Adobe PDFReader будет открыт в вашем случае.

0 голосов
/ 09 февраля 2012

В поисках ответа я прихожу к следующему выводу: так, если мы используем form.submit (), то контроллер просто возвращает результат файла.Если мы используем ajax для передачи данных, мы не можем вернуть pdf, но должны вернуть то, что вы передаете get (например, href), которое вернет pdf.

...