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

时间:2017-03-31 19:17:57

标签: asp.net-mvc asp.net-core-mvc

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

 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)将原始内容直接存储在数据库中,这是最糟糕的还是最好的做法?

1 个答案:

答案 0 :(得分:1)

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

  • 如果您无法阅读所有文字会怎样?
  • 信息多久会改变一次?
  • 提议的解决方案管理难度有多大?

我们知道File.ReadAllText()如果找不到该文件,或者该文件已被锁定,或者您不再拥有该文件的权限,则会引发异常。我们也知道,如果View中有例外,则用户会收到丑陋的错误页面。这些都不可取。

我认为在@Html.Raw(File.ReadAllText(Model.ContentURL)) ViewViewBag.RawContent是一个坏主意是安全的。

  

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

您的其他解决方案都能够处理第一颗子弹的问题。它们也都是非常好的解决方案,所以你的项目的答案实际上取决于接下来两个子弹的答案。

  • 如果您的文件在部署应用后无法更改,那么填充gregexpr非常不错。
  • 您需要有人编辑该文件而无需重新部署任何其他内容,然后您可能想要使用该数据库。