正如大衛在他的評論中指出的,我以同樣的道路取得了成果。
我的MVC視圖有一個屬性:
public string ReportDownloadUrl { get; set; }
中樞方法只返回該文件的UID被下載:
public ActionResult GetReport<T>(ReportModel pageModel)
{
//generate the report and save to an internal server store
var fileKey = GenerateReport(...);
//return the unique file id
return new JsonResult {Data = fileKey, JsonRequestBehavior = JsonRequestBehavior.AllowGet};
}
客戶端腳本調用樞紐方法和通過下載文件網址:
hubMethod(model, fileExtension)
.done(function (ret) {
if (ret.Data) {
var url = downloadUrl + "/" + ret.Data;
DownloadURL(url);
}
})
function DownloadURL(url) {
var iframe = document.getElementById("hiddenDownloader");
if (iframe === null) {
iframe = document.createElement('iframe');
iframe.id = "hiddenDownloader";
iframe.style.visibility = 'hidden';
document.body.appendChild(iframe);
}
iframe.src = url;
}
實際文件下載的控制器操作:
public ActionResult DownloadFile(string id)
{
//3 first characters of id are file extension in my case
var format = id.Substring(0, 3);
var fileFormat = (FileFormat)Enum.Parse(typeof(FileFormat), format, true);
var file = (KeyValuePair<string, byte[]>)DataStore[id];
return File(file.Value, fileFormat.ToDescription(), file.Key);
}
希望它可以節省一些人的時間。
你能解釋爲什麼你需要這個信息在樞紐內的情況嗎?也許有另一種方法。 – David
集線器的功能是生成一個具有唯一文件ID的報告。我想保留集線器內的路由邏輯,因爲我需要在客戶端「手動」構建URL。 – Neilski
爲什麼不返回唯一的文件ID而不是url,並在UI中構建鏈接。然後你的Hub沒有連接到你的視圖。在View中構建鏈接應該很容易,如果您需要更改或使用其他版本,則不會將其集成到集線器中。 – David