2013-12-11 109 views
2

我想從我的SignalR Hub生成路由URL。在SignalR Hub中生成路由URL

在控制,我會做這樣的事情:

var u = new UrlHelper(this.ControllerContext.RequestContext); 
string url = u.Action("Index", "Transfer", new { id = 27 }); 

或者:

var route = RedirectToAction("Index", "Transfer", new { id = 27 }); 
string url = Url.RouteUrl(route.RouteName, route.RouteValues) 

但無論方法似乎是在輪轂內相關。有沒有我可以用來構造URL的機制?

+0

你能解釋爲什麼你需要這個信息在樞紐內的情況嗎?也許有另一種方法。 – David

+0

集線器的功能是生成一個具有唯一文件ID的報告。我想保留集線器內的路由邏輯,因爲我需要在客戶端「手動」構建URL。 – Neilski

+0

爲什麼不返回唯一的文件ID而不是url,並在UI中構建鏈接。然後你的Hub沒有連接到你的視圖。在View中構建鏈接應該很容易,如果您需要更改或使用其他版本,則不會將其集成到集線器中。 – David

回答

1

正如大衛在他的評論中指出的,我以同樣的道路取得了成果。

我的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); 
} 

希望它可以節省一些人的時間。

+0

謝謝亞歷克斯,我最終做了類似的事情(雖然不夠整潔 - 我在客戶端腳本中對網址進行了硬編碼!)。我相應地更新了我的代碼,並且它完美地工作。 – Neilski