ASP.NET Core MVC中Edit Action被重复调用且出现scss.map异常请求
问题根源与解决方案
问题本质
这和Entity Framework完全无关,是静态资源路径错误引发的路由误匹配:
- 当你访问Edit页面时,当前URL为
/EFController/Edit/{id},浏览器加载CSS后会自动尝试请求对应的Source Map文件(site.scss.map)。 - 由于CSS引用使用相对路径逻辑,浏览器会以当前页面URL为基准,发起
/EFController/Edit/site.scss.map的请求,而这个路径刚好命中了MVC默认路由规则({controller}/{action}/{id?})。 - 此时
site.scss.map被当作Edit action的id参数传入,但该值与NoteRecord模型的Id类型不匹配,直接导致ModelState无效,同时出现第二次调用的异常现象。
解决方案
1. 修正CSS引用为绝对路径
确保_Layout.cshtml中的CSS引用基于站点根目录,避免相对路径歧义:
<link rel="stylesheet" href="~/@Manifest["scss/site.scss"]!.File" asp-append-version="true" />
注意:需确认Manifest生成的File值为绝对路径格式(如css/site.[hash].css),而非相对路径。
2. 配置Vite生成正确的Source Map路径
在vite.config.ts中设置Source Map的绝对路径引用,让浏览器从站点根目录请求map文件:
export default defineConfig(async () => { const config: UserConfig = { build: { sourcemap: true, rollupOptions: { input: ['Client/main.ts', "Client/scss/site.scss"], output: { assetFileNames: 'css/[name].[hash].css', sourcemapPathTransform: (relativePath) => { return `/css/${relativePath}`; } } } } }; return config; });
3. 确保静态资源中间件优先处理
在Program.cs中,将静态资源中间件注册在路由中间件之前,让静态资源请求优先被处理,不会落入控制器路由:
app.UseStaticFiles(); // 先处理静态资源 app.UseRouting(); // 其他中间件... app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
4. 可选:限制Edit action的参数类型
在EFController的Edit方法中明确参数类型,避免非预期的字符串传入:
public IActionResult Edit(int id) { // 你的业务代码 }
这样当请求传入site.scss.map这类非数值时,会直接返回404,不会进入action触发ModelState错误。
内容的提问来源于stack exchange,提问作者Gigi
相关产品推荐
相关产品推荐

