为什么在MVC asp.net应用程序中,.NET会生成两个web.config文件?

41

我是MVC 3的新手。为什么要使用两个web.config文件?

enter image description here

这两个web.config文件有何区别,各自的目的和功能是什么?


这是你问题的解决方案,MVC应用程序中的两个WebConfig文件。希望这个链接能对你有所帮助。 - Brijesh
6个回答

57

这是一个web.config文件继承的示例,摘自MSDN

您可以在应用程序目录中分发ASP.NET配置文件,以便在继承层次结构中配置ASP.NET应用程序。此结构允许您在适当的目录级别实现应用程序所需的配置详细级别,而不会影响较高目录级别的配置设置。

具体来说,在MVC项目中,View子目录中的web.config用于定制.cshtml / .aspx文件。您可以在子文件夹中使用web.config文件来扩展、覆盖和删除从应用程序本身的根目录以及更高层次继承的设置,例如,一直到machine.config

/Views/web.config中常见的配置包括:

  • 阻止尝试直接访问razor和aspx视图的请求(这些需要通过适当的路由从控制器提供)。 针对这种直接请求配置了404响应,例如:

<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
  • 为了设置视图页面的默认导入命名空间,否则必须通过using显式添加。您可以在此处添加常见自定义程序集的命名空间(例如自定义HTML助手扩展),例如。
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    ...
  • 配置MVC的反跨站脚本攻击RequestValidation过滤器,配置说明在配置文件中有注释:

  • 要配置 MVC 的防 XSS RequestValidation 过滤器。配置文件中的注释最能说明这个问题:

<!--
    Enabling request validation in view pages would cause validation to occur
    after the input has already been processed by the controller. By default
    MVC performs request validation before a controller processes the input.
    To change this behavior apply the ValidateInputAttribute to a
    controller or action.
 -->

如何防止某个 web.config 继承上一级目录中另一个 web config 的所有数据? - AgentFire
2
@AgentFire 你可以有选择地使用<clear><remove>标签来清除从父配置继承的所有或特定设置。 - StuartLC
1
@StuartLC 谢谢,但我通过使用“location”标签解决了这个问题。 - AgentFire

21

我想补充一点,/Views 文件夹中的 Web.Config 是声明特定于视图的命名空间的绝佳方式(如果不是最好的)。在 Web 应用程序中,几乎每个视图都会传递一个 ViewModel(而不是实际的模型)给它。在 @model 后声明完整的命名空间或具有相同的 @using App.Web.Viewmodels 很繁琐。这种方式,所有的 viewmodels 都是自动可用的,你必须额外地努力让真正的模型进入范围,这应该立即引起一些警报。

此外,通常一个应用程序可以得到很多扩展方法,专门用于视图(HTML-helper 跳入脑海)。在 /Views/Web.Config 中定义扩展类别的名称空间是有意义的。这样你就永远不会想 "为什么 IntelliSense 找不到我的 @Html.ImageLink() 方法?!"


2
我不明白为什么这个答案被标记为问题的答案。我搜索了问题并阅读了标记的答案,但不理解这个答案是否相关,直到我看到其他答案后才意识到这个答案是原始答案的补充。请标记正确的答案,否则会很混乱。 - Hammad Sajid

6

视图有自己的配置。如果你处理区域,那么你将会知道有不止一个配置。

实际上,关键点在于视图的Web.Config是针对视图特定配置的,比如阻止直接访问视图。

编辑1: 根据评论要求提供更多解释。

在Views文件夹中存在web.config文件,以防止通过除控制器之外的任何方式访问视图。在MVC设计模式中,控制器应该路由请求并向调用客户端返回渲染视图。这意味着 localhost9999://Home/Index.cshtml 不应直接可访问。


你能详细解释一下吗? - Datta
你好Datta,web.config文件存在于Views文件夹中,以防止除控制器以外的任何方式访问你的视图。在MVC设计模式中,控制器应该路由请求并将渲染的视图返回给调用客户端。这意味着localhost9999://Home/Index.cshtml不应直接可访问。 - Sunny_Sid
@Sunny_Sid 你好,Sunny。Views文件夹中存在web.config文件来防止访问你的视图,你可以解释一下这行是什么意思吗? - DIR

4

为防止任何方式(除了控制器)访问你的视图,web.config文件存在于Views文件夹中。在MVC设计模式中,控制器应该路由请求并将一个渲染后的视图返回给调用客户端。

这意味着localhost9999://Home/Index.cshtml不应该直接被访问。


4

ASP.NET配置存储在web.config文件(XML文件)中。

这些文件可以出现在ASP.NET应用程序的许多目录中。它们有助于在部署之前甚至在部署后配置应用程序行为,基于您可以使用记事本进行编辑的事实。此外,它们使您的代码和配置数据分离。

每个web.config文件适用于存在它的目录和所有子目录。子目录中的web.config文件可以用于覆盖父目录的web.config文件。

您可以通过使用位置元素来覆盖单个文件或目录。详见链接

设置继承规则如下:

首先是位于systemroot\Microsoft.NET\Framework\versionNumber\CONFIG\通常目录中的machine.config文件。

在同一目录中存在一个“主”web.config文件,为运行在机器上的ALL asp.net应用程序定义设置。

然后是应用程序中存在的web.config文件。

更多信息:

ASP.NET配置概述

ASP.NET配置文件层次结构和继承


1
除了简单地分发项目设置,您还可以在运行时将其转换为发布。一手掌握。 参见:

Web.config变换

变换语法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接