我想从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 :(得分:1)
大卫在评论中指出,我用同样的道路取得了成果。
我的MVC视图有一个属性:
public string ReportDownloadUrl { get; set; }
hub方法只返回要下载的文件的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};
}
客户端脚本调用hub方法并通过Url下载文件:
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);
}
希望能节省一些人的时间。