目录
大家好,我是你们的William_cl,今天咱们聊一个 MVC 入门绕不开的 “隐形基石”——Web.config 配置文件。
如果你把 MVC 应用比作一家餐厅,那 Web.config 就像餐厅的 “后台总控室”:里面记着食材仓库的钥匙(连接数据库)、顾客找座位的指引(路由规则),少了它或者配置错了,整个餐厅就得瘫痪。
今天咱们聚焦两个核心功能:连接字符串(找数据库的 “密码本”)和路由配置(URL 导航的 “路标”),带大家避坑少走弯路。

一、连接字符串:应用与数据库的 “WiFi 密码”
咱们写 MVC 应用,归根到底要跟数据库打交道(比如查用户数据、存订单信息)。连接字符串就是应用和数据库之间的 “WiFi 密码”—— 没它连不上,写错了也连不上。
1. 基本格式(以 SQL Server 为例)
在 Web.config 的节点下,有个专门放连接字符串的节点,长这样:
<configuration>
  <connectionStrings>
    <!-- 本地数据库示例(Windows身份验证) -->
    <add name="MyDbContext" 
         connectionString="Server=localhost;Database=MyShop;Integrated Security=True;" 
         providerName="System.Data.SqlClient" />
    <!-- 远程数据库示例(SQL Server身份验证) -->
    <add name="RemoteDb" 
         connectionString="Server=192.168.1.100;Database=UserDB;Uid=admin;Pwd=123456;" 
         providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>
关键参数解释:
- name:给这个连接起个名字(比如 “MyDbContext”),后续在代码里通过这个名字调用(类似给 WiFi 起名 “家里的网”)。
- connectionString:核心配置,包含: 
  - Server:数据库服务器地址(本地常用localhost、.或.\SQLEXPRESS;远程填 IP 或域名)。
- Database:要连接的数据库名称(比如 “MyShop”)。
- 身份验证:Integrated Security=True用 Windows 账号登录;Uid和Pwd是 SQL Server 账号密码。
 
- providerName:指定数据提供者(SQL Server 固定用System.Data.SqlClient,别瞎改)。
2. 常踩的 3 个坑(附解决方案)
坑 1:服务器地址写错,数据库 “找不到家”
场景: 本地调试时,把Server=localhost写成Server=localhos(少个 t),或者远程服务器 IP 输错,结果报 “无法连接到服务器”。
 类比: 就像寄快递填错地址,包裹肯定送不到。
 解决:
- 本地测试先确认 SQL Server 服务是否启动(可在 “服务” 里看 “SQL Server (MSSQLSERVER)” 状态)。
- 服务器名可以用(local)或.代替localhost,避免拼写错误。
坑 2:数据库名拼写错误,“仓库门牌号不对”
场景: 数据库实际叫 “ShopDB”,配置里写成 “ShopDb”(大小写?SQL Server 默认不区分,但最好跟实际一致),或者少个字母,报 “数据库不存在”。
 类比: 去小区找 “3 栋”,结果你记成 “5 栋”,肯定找不到。
 解决: 打开 SQL Server Management Studio(SSMS),复制粘贴数据库名到配置里,别手敲。
坑 3:明文存储密码,“把钥匙挂在门上”
场景: 连接字符串里直接写Pwd=123456,上线后被人看到配置文件,数据库直接裸奔。
 类比: 把家门钥匙插在门锁上出门,太危险!
 解决: 发布前用 Visual Studio 的 “加密配置文件” 功能(右键 Web.config→"管理用户机密"),或者在服务器上用aspnet_regiis工具加密。
二、路由配置:URL 的 “导航路标”
用户在浏览器输入http://xxx.com/Product/Detail/1,MVC 怎么知道要调用ProductController的Detail方法,并且传参数1?这就得靠路由配置 —— 它就像小区门口的路标:“去 3 栋左转(对应 Product 控制器),2 单元(对应 Detail 方法),501 室(对应参数 1)”。
1. 默认路由配置(核心代码)
路由配置通常在App_Start/RouteConfig.cs里,最终会写到 Web.config 的运行时配置中(简化后如下):
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        // 忽略.axd文件(系统用,不用管)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        // 默认路由规则
        routes.MapRoute(
            name: "Default", // 路由名称(唯一)
            url: "{controller}/{action}/{id}", // URL格式
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 默认值
        );
    }
}
规则解释:
- url: “{controller}/{action}/{id}”:表示 URL 按 “控制器 / 方法 / 参数” 划分。
 例:http://xxx.com/User/Login → 对应UserController的Login方法(无参数)。
 例:http://xxx.com/Order/Show/100 → 对应OrderController的Show(int id)(id=100)。
- defaults:如果 URL 不完整,就用默认值。
 例:直接输http://xxx.com → 默认调用HomeController的Index方法(无参数)。
2. 常踩的 3 个路由坑
坑 1:路由顺序错,“路标放反了”
**场景:**先定义了通用路由,再定义具体路由,导致具体路由被覆盖。
// 错误顺序
routes.MapRoute(
    name: "通用路由",
    url: "{controller}/{action}/{id}",
    defaults: new { ... }
);
routes.MapRoute(
    name: "商品详情路由", // 这个路由永远不会生效!
    url: "Product/Detail/{productId}",
    defaults: new { controller = "Product", action = "Detail" }
);
类比: 先立个 “所有楼都往左转” 的牌子,再立 “3 栋往右转” 的牌子,结果找 3 栋的人还是会左转。
 解决: 具体路由放前面,通用路由放最后(路由匹配是 “从上到下”,找到第一个匹配的就生效)。
坑 2:参数名不匹配,“钥匙孔对不上”
场景: 路由里写的是{id},但控制器方法参数叫productId:
// 路由
url: "{controller}/{action}/{id}"
// 控制器方法(错误)
public ActionResult Detail(int productId) { ... } // 会报"参数丢失"
类比: 锁是 “圆孔”(id),你拿了 “方孔钥匙”(productId),肯定打不开。
 解决: 让参数名和路由中的占位符一致,或者用[Bind(Prefix=“id”)]指定:
// 正确写法1:参数名一致
public ActionResult Detail(int id) { ... }
// 正确写法2:指定前缀
public ActionResult Detail([Bind(Prefix="id")] int productId) { ... }
坑 3:忘记注册路由,“没放路标”
场景: 新建了路由但没在Global.asax里注册,导致路由不生效。
 类比: 路标设计好了但没立在路边,等于白做。
 解决: 确保Global.asax里有这句(MVC 默认会加,但手动改配置时可能删错):
protected void Application_Start()
{
    RouteConfig.RegisterRoutes(RouteTable.Routes); // 注册路由
}
总结:Web.config 是 “地基”,配置错了全白搭
Web.config 里的连接字符串和路由配置,就像应用的 “水电系统”—— 平时不显眼,出问题就全瘫。记住:
- 连接字符串要 “对地址、对名称、藏密码”;
- 路由配置要 “先具体、后通用、参数对”。
 最后想问问大家:你在配置 Web.config 时踩过最离谱的坑是什么?是把数据库名写成 “test123” 结果真有这个库,还是路由顺序搞反导致所有请求都跳首页?评论区分享一下,让新手少走弯路~
如果觉得有用,别忘了点赞收藏,咱们下期聊 MVC 的控制器与视图!
 
                   
                   
                   
                   
                             
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   62
					62
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            