【问题标题】:Why will the addressing method that works for images not work for text files?为什么适用于图像的寻址方法不适用于文本文件?
【发布时间】:2017-05-01 19:08:17
【问题描述】:

我正在使用 Visual Studio 2017。我正在开发一个兴趣清单 Web 应用程序。有 60 帧,每帧有 2 张图片和每张图片的文字说明。我显示图片没有问题,但是当对文本文件使用相同的寻址方法时,它不起作用。

这可以显示图像:

img src="~/Images/RIPAImages/@m@imagePathL" style="width:450px; height:270px; enable-background:new"

如果我给我电脑上的一个文件夹的绝对路径,它会像这样工作并读取文本文件:

rtxt = System.IO.File.ReadAllText(@"C:/users/Owner/Documents/Documents/Beulah Farms/10" + @txtPathR);

但是当我使用相同的寻址方法来访问位于应用程序文件系统中的文本文件时,它不起作用。它说该位置不存在。 这是我使用的方法:

rtxt = System.IO.File.ReadAllText(@"~/Images/RIPAImages/"+@m + @txtPathR);

我意识到我没有与读取图像文件时相同的引号,但如果我以相同的方式使用引号,它真的会爆炸。

我最初将其开发为一个 Windows 程序。然后我在 VS 2010 上做到了,当时 V 实际上意味着视觉。那时我正在使用 Visual Basic。然后我搞砸了,下载了 2015 和 2017。我也在尝试迁移到 C#。

如果任何人都可以提供任何帮助,我将不胜感激。谢谢

【问题讨论】:

标签: c# razor asp.net-core-mvc visual-studio-2017


【解决方案1】:

在我们回答您的问题之前,有几件事:

  1. 如果您使用的是 VS 2017,那么您应该使用 String Interpolation。这是最好的!一旦开始使用就不会再切换回来。
  2. 您似乎是从 razor 调用 System.IO。我希望不会。(你真的不应该)这就是 MVC 中的“控制器”的用途。
  3. 如果不在视图模型中,至少在 ViewData 中,您可以在控制器中执行此处理,然后将其传递给视图。

现在,HTML 标记中的~ 指的是您的home 目录。如果是 IIS 或 ASP.NET 核心,则为 wwwroot 目录。

当您在 System.IO API 中使用它时,它没有任何意义,被视为任何其他路径。因此,如果您的项目在c:\samples\myproj 运行,那么System.IO.File.ReadAllText(@"~/Images/RIPAImages/..." 将转换为c:\samples\myproj\~\Images\RIPAImages,这显然不存在。因此,最好的方法是在您的控制器中执行以下操作。

namespace foo.Controllers
{
    public class BarController : Controller
    {
        private IHostingEnvironment _env;

        public BarController(IHostingEnvironment env)
        {
            _env = env;
        }

        public IActionResult Index()
        {
            var text1 = "site.css";
            ViewData["textInfo"] = Path.Combine( _env.WebRootPath,"css" , text1); //becomes myapppath/wwwroot/css/site.css
            return View();
        }
    }
}

然后在视图中你会调用:

@ViewData["textPath"].ToString()

【讨论】:

  • 查看 Server.MapPath
  • 控制器示例中是否应该有 using 语句?我得到一束曲线。它们在 IHosingEnvironment、_env 和 env 下。然后它甚至不允许我输入 Path.Combine。它将其更改为 - 哦,好吧,我回去看看它一直在更改它,然后它允许我输入 Path.Combine。
  • 是的,您应该能够通过相应行左侧的 Visual Studio 快速操作(灯泡)来解决所有这些问题...
【解决方案2】:

对于 Web 应用程序,您可以使用 Server.MapPath 获取文件路径。

例如:

rtxt = System.IO.File.ReadAllText(Path.Combine(Server.MapPath(@"~/Images/RIPAImages/"),@m,@txtPathR));

对于任何类型的应用程序,如 Web、Windows 窗体、控制台,您都可以使用 DirectoryInfo 获取路径。

例如:

 var startupPath =new DirectoryInfo(Path.GetDirectoryName(Uri.UnescapeDataString(newUriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path))).Parent.FullName;//path of that folder which contain bin folder
    var rtxt = System.IO.File.ReadAllText(startupPath+"\\Images\\RIPAImages\\"+@m+@txtPathR);

注意: @m@txtPathR 您的路径变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    相关资源
    最近更新 更多