读取视图中的文件是一种不好的做法吗?



假设一个简单的博客,其中包含一个数据库,其中的文章维护为:

CREATE TABLE [Articles](
[ArticleId] INT IDENTITY(1,1) NOT NULL,
[ContentURL] NVARCHAR(250) NOT NULL
....
) 

通过将位于ContentURL的文件读取为:(具体来说,可以这样缓存文件吗?

@model Articles
...
<div class="row">
<div class="col-md-8 col-xs-12">
@Html.Raw(File.ReadAllText(Model.ContentURL))
</div>
</div>

还是在控制器中执行此操作并将其作为ViewBag.RawContent传递会更好?([OutputCache]属性是否有助于将文件保留在内存中?

另一方面,如何使用NVARCHAR(MAX)将原始内容直接存储在数据库中,这是最糟糕的做法还是最佳做法?

在回答这个问题时,你必须考虑几件事:

  • 如果您无法阅读所有文本会怎样?
  • 信息多久会更改一次?
  • 建议的解决方案有多难管理?

我们知道,如果找不到文件,或者文件被锁定,或者您不再拥有该文件的权限,File.ReadAllText()可能会引发异常。 我们也知道,如果你在View中有异常,用户会得到丑陋的错误页面。 这两种情况都不可取。

我认为可以肯定地说,@Html.Raw(File.ReadAllText(Model.ContentURL))View是一个坏主意.

如果确实抛出异常,则需要一种方法来恢复。

您的其他解决方案都提供了处理围绕第一个项目符号的问题的能力。 它们也是非常好的解决方案,因此项目的答案实际上取决于接下来两个项目符号的答案。

  • 如果在部署应用后文件不会更改,则填充ViewBag.RawContent非常好。
  • 您需要某人能够在不重新部署任何其他内容的情况下编辑该文件,然后您可能希望使用数据库。

最新更新