2014-10-31 74 views
1

我想要按照此example显示进度条而不使用ajax来下载文件。不使用ajax下载文件

我使用基诺,html和webapi。我有低于该按钮的点击事件调用HREF代码

this.getMeData= function() { 

    uRlPath("/api/GetSomeData?id=" + 12) 
       + "&name=" + getName.toString() 
       + "&downloadtoken=" + new Date().getTime()); 

    $('#myLink').click(); 

    location.href = $('#myLink').attr('href'); 


    }; 

这是我的HTML

<tr> 
      <td class="labelText"> 
       <button data-bind="click: getMeData"> 
        Download Data 
       </button> 

      </td> 
     </tr> 
     <tr> 
      <td> 
       <a id="myLink" data-bind="attr: { href: uRlPath }" style="visibility: hidden">Open </a> 
      </td> 
     </tr> 

我现在想请我的HREF

这是点击事件的一些功能我的webapi方法返回我cookie和二进制文件

public HttpResponseMessage GetSomeData(int id, string name, string downloadtoken) 
    { 
     var returnData= new HttpResponseMessage(HttpStatusCode.OK); 
     returnData.Content = new ByteArrayContent(mybyteArray); 
     var cookie = new CookieHeaderValue("downloadtoken", downloadtoken); 
     returnData.Headers.AddCookies(new CookieHeaderValue[] { cookie }); 
     returnData.Content.Headers.ContentDisposition = 
      new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
     returnData.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 


     returnData.Content.Headers.ContentDisposition.FileName = "myfile.pdf"; 
     return returnData; 
    } 

要非常精确我想要有与示例中提供的行为相同的行为。在示例中,他们使用表单提交,但我没有任何形式,因为我只是使用HTML,淘汰赛。我已经包含了示例中提到的所有库。

如果您需要更多输入信息,请告诉我。

回答

1

我自己找到了解决方案。我用下面的代码为饼干

var attempts = 30; 
var checkTime 

     startProgressBar(true) 

     checkTime= window.setInterval(function() { 

      var cookieValue = $.cookie('downloadtoken'); 

      if ((cookieValue == token) || (attempts == 0)){ 
       stopDownload(); 
      } 
      attempts --; 
     }, 1000); 

不断检查在finishDownload功能我清楚的cookie,并停止进度条

function stopDownload() { 
     window.clearInterval(checkTime); 
     $.cookie('downloadtoken', null); //clears this cookie value 
     stopProgressBar(false); 
    } 

这是进度条的html代码

<div data-bind="visible: stopProgressBar" style="top:248px;left: 320px;"> 
    <img src="../images/ProgressBar.jpg" /> 
</div> 
0

如果你只是想调用blockUIForDownload功能链接被点击的时候,你可以做一个“点击”绑定,就像你一样的按钮:

<a id="myLink" data-bind="attr: {href: uRlPath}, click: blockUIForDownload" style="visibility: hidden">Open</a> 

(这是假设的功能。已经视图模型中定义)

的“点击”绑定这里参见官方文档:http://knockoutjs.com/documentation/click-binding.html

然而,在我看来像你过于复杂了一点 - 在您发布的示例中,隐藏输入f因为他们使用表单输入作为将令牌传输到服务器的手段,因此需要使用该字段。

在你的情况令牌被作为href属性的一部分通过,所以可以大大简化代码:

1)拆下无形链路完全

2)与更换getMeData功能以下:

this.getMeData= function() { 
    window.open("/api/GetSomeData?id=" + 12 
       + "&name=" + getName.toString() 
       + "&downloadtoken=" + new Date().getTime()); 
    blockUIForDownload(); 
    }; 
+0

我需要同类的例子中提供的机制。在例子中,他们使用表单提交,我没有任何形式提交,因为我使用基诺和HTML。我想要的是调用按钮上的webapi服务。此服务返回我的PDF文件。所以我想要的是显示一些进度条或什么东西,直到文件被下载。你提到我提供的例子吗?另外我不能使用window.open打开新窗口。 – Happy 2014-11-03 08:06:54