假设一个简单的博客,其中包含一个数据库,其中的文章维护为:
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
非常好。 - 您需要某人能够在不重新部署任何其他内容的情况下编辑该文件,然后您可能希望使用数据库。