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」では、PDFをbyte []に​​ロードし、ユーザーセッションに保存します。

[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がロードされますが、2番目、3番目...は同じpdfがロードされます、なぜですか?(私は正しいパラメータを渡すかどうかをチェックしました、はい私は=を渡します))

Obs:pdfをロードするためにデータを投稿すると、jquery returnで、コードは最初にアクションGetPDFを呼び出しますが、再度投稿すると、アクションGetPDFは呼び出されなくなります。

4

3 に答える 3

1

ヴィニシウス

以下が役に立てば幸いです。私のアプリの 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");
    }
}

もちろん、それぞれを表示するには適切な「アプリ」が必要なため、結果はビュー内に表示されません。そのため、Adobe PDFReader が開かれます。

于 2012-02-09T13:24:39.383 に答える
1

あなたのコードは奇妙に思えます。dadosPOST AJAX リクエストをいくつかのコントローラー アクションに送信していますが、結果 (変数)を使用して成功コールバックで何もしていないようです。また、アクションを2回呼び出しているようですVisualizarCredencial.1回はAJAXリクエスト用、もう1回はPDFのレンダリング用です。

あなたはあなたの意図を説明していないので、あなたが何をしようとしているのかを推測することしかできません.2つのコントローラーアクションを持つことができると思います.1回目は、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)を返す必要があります。これによりpdfが返されます。

于 2012-02-09T16:58:04.507 に答える