ASP.NET Core Razor页面中如何在JavaScript脚本中正确获取ViewData传递的文件路径值?
ASP.NET Core Razor页面中如何在JavaScript脚本中正确获取ViewData传递的文件路径值?
我来帮你分析下问题核心,再给你针对性的解决方案:
首先你遇到的关键问题是服务器端渲染和客户端AJAX异步请求的时机不匹配:
- 页面里的
@filePath是服务器第一次渲染页面时生成的,这时候OnGetViewFile还没被触发,ViewData["FilePath"]自然是空的,所以脚本里拿到的是空字符串。 - 当你通过AJAX调用
OnGetViewFile时,服务器返回的是整个页面的HTML,但你在AJAX的success回调里还是用@filePath,这个变量已经是页面初始渲染的空值了,不会因为AJAX请求而动态更新。
方案1:直接返回页面(非AJAX场景)的正确传值方式
如果你的场景是直接访问页面触发OnGetViewFile,不是通过AJAX,那可以用Json.Serialize配合Html.Raw处理路径里的反斜杠转义,确保JavaScript能正确解析:
@{ var filePath = ViewData["FilePath"] as string; } <script type="text/javascript"> // 用Json.Serialize处理转义,Html.Raw避免被HTML编码 let viewFileName = @Html.Raw(Json.Serialize(filePath)); console.log(viewFileName); </script>
方案2:针对你当前的AJAX场景(推荐)
既然你是通过AJAX触发OnGetViewFile,完全没必要返回整个页面,直接让handler返回JSON数据更高效,也符合AJAX的使用逻辑:
第一步:修改后台OnGetViewFile方法
// .cshtml.cs public IActionResult OnGetViewFile(string fileName) { var fileProvider = _fileServerProvider.GetProvider("/Accounting"); var fileInfo = fileProvider.GetFileInfo(fileName); // 直接返回包含文件路径的JSON对象,而非整个页面 return new JsonResult(new { FilePath = fileInfo.PhysicalPath }); }
第二步:修改前端AJAX代码
action: function (e, dt, node, config) { let selectedRow = dt.row('.selected').data(); $.ajax({ url: '?handler=ViewFile&fileName=' + selectedRow.FileName, type: 'GET', success: function (result) { // 直接从AJAX响应结果中获取FilePath var filePath = result.FilePath; console.log(filePath); // 这里可以继续处理你的文件查看逻辑 }, error: function (xhr, status, error) { alert('Error: The File was ' + error); } }) }
重要安全提醒
直接把服务器的物理路径暴露给前端存在安全风险,可能泄露你的服务器文件结构。如果你的目的是让用户查看/下载文件,建议直接返回FileResult,让服务器处理文件传输,而非传递物理路径:
修改后台方法为返回文件
public IActionResult OnGetViewFile(string fileName) { var fileProvider = _fileServerProvider.GetProvider("/Accounting"); var fileInfo = fileProvider.GetFileInfo(fileName); if (!fileInfo.Exists) { return NotFound("文件不存在"); } // 返回文件,让浏览器自动处理预览或下载 return PhysicalFile( fileInfo.PhysicalPath, "image/png", // 根据文件类型修改MIME类型,比如PDF用"application/pdf" fileInfo.Name ); }
前端直接打开文件
action: function (e, dt, node, config) { let selectedRow = dt.row('.selected').data(); // 用window.open打开文件URL,浏览器会自动处理预览/下载 window.open('?handler=ViewFile&fileName=' + selectedRow.FileName, '_blank'); }
备注:内容来源于stack exchange,提问作者dev_in_training
相关产品推荐
相关产品推荐

