You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:28:08