在ASP.NET MVC上提供静态文件(C#)

时间:2014-04-15 03:20:18

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我是.NET框架的新手,我想知道提供静态内容和访问用户生成内容的最佳方式是什么。

假设我有以下文件:

logo.jpg
document.pdf
etc.doc

我应该把它放在哪里(在哪个文件夹上)?我如何访问它?

最后,把它带到另一个层面。假设我有一个允许用户上传文件的网络应用程序(比如说一些照片)。我想知道的是我的文件夹/目录的结构应该如何?

在django / CI中,我会有一个文件夹如下:

应用/ {全web应用程序相关的文件夹和文件,进入-这里} 上传/ {所有相关的用户生成内容 - 去 - 在这里,分类按文件类型} 资产/ {CSS-JavaScript的文档将-GO-这里}

注意:我没有做任何事情或做过任何尝试。仅仅因为我不知道如何访问try静态内容。我曾经尝试访问位于Content / Scripts文件夹中的* .css或* .js文件。

即:localhost:12345 / Scripts / jquery.js

事实证明,它不是ASP.NET MVC中的直接过程

哦顺便说一下, 在某些场合,我还想从我的css文件中访问我的图片。这给我带来了另一个困惑。

编辑1:我阅读了以下文章

http://www.c-sharpcorner.com/uploadfile/dhananjaycoder/working-with-images-in-Asp-Net-mvc-framework/

然而它不适用于我当前版本的MVC(我正在使用MVC 5)

编辑2 :所以,这是我到目前为止一直在试验的内容

  1. 我在根目录上创建了一个名为 Assets 的文件夹(与模型,控制器等相同)。
  2. 内部资产我创建子文件夹(即图像,文档等)
  3. 然后我想直接从我的观点访问这些文件,我会这样:

    img src =" @ Url.Content("〜/ Asset / images / picture.png")"

  4. 如果我想访问图像文件,上面的示例是合适的。

    但我不确定这是否是理想的做法。然而,这是我目前可以遇到的最简单的解决方案(或者我应该说,相当天真)。

    任何提示都将不胜感激。

2 个答案:

答案 0 :(得分:0)

假设我有以下文件:logo.jpg,document.pdf等.doc,我应该放在哪里(在哪个文件夹上)?以及我如何访问它?

您在ED​​IT 2上所做的一切都很好。 MVC框架足够聪明,可以禁用字典浏览。如果您尝试资产/assets//assets/images,则将获得403。

此外,即使您有一个名为“ assets”的控制器,一个名为“ images”的方法以及一个字符串ID为“ picture.png”的请求,该请求也不会到达该控制器方法。相反,它将仍然为您提供图像文件。看起来MVC优先于它找到的静态文件,而不是MVC路由?


假设我有一个网络应用程序,允许用户上传文档(比如说一些图片)。我想知道的是文件夹/目录的结构应该如何?

如果您打算仅将用户的上载作为物理文件存储在应用程序中(而不是将其保存到持久性存储中),则可以在根目录上创建一个文件夹,例如“ uploads”,并将其上载到那里。

我会通过ID(希望它是一个GUID而不是整数ID)将其上传内容分离到“上传”下的不同子文件夹中,以防万一当您要在前端显示上传路径时,用户无法轻松猜测其他用户的上传位置:

// assets
// uploads
//     xxxx-xxxx-xxxx-xxxx
//         files
//     xxxx-xxxx-xxxx-xxxx
//         files

不要忘记在将应用程序发布到的服务器上设置此上载文件夹的权限。


在某些情况下,我还想从css文件访问图像。

在这种情况下,您将必须使用相对URL,并且MVC的根默认为~/Content。例如,假设您要使用保存在/ assets / images /下的picture.png作为块的背景图片:

#test-block {
    width: 250px;
    height: 250px;
    background-image: url(`~/assets/images/picture.png`);'
    background-size: cover;
}

您认为它可以正确访问图片并将其用作块的背景。但实际上,它会生成如下内容:

background-image: localhost/content/~/assets/images/picture.png

这真是令人讨厌,因为您必须使用../而不是~/手动返回一级来抓取图像:

background-image: url(`../assets/images/picture.png`);'

对我来说,这不是一个可以接受的解决方案,如果将应用程序发布到服务器上的虚拟文件夹(而不是wwwroot),那么它将很麻烦。

对于设置这样的背景图像,我宁愿在@Url.Content()的帮助下使用内联样式,因为我不必担心它们的路径如何相互关联:

<div id="test-block" 
    style="background-image: url('@Url.Content("~/assets/images/picture.png")');">
</div>

答案 1 :(得分:-3)

ASP.NET MVC默认允许静态文件服务。而不是使用@ URL.Content直接写入以/表示根文件夹

开头的路径
<img src="/Asset/images/picture.png" />