You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript调用ASP.NET MVC控制器URL特殊字符转义后仍404问题

问题根源与解决方案

咱们一步一步拆解问题:

1. 路由约束导致的404

你的ASP.NET MVC控制器路由用了{name:alpha}约束,这个约束只允许匹配纯字母(a-z、A-Z),完全不接受下划线_、连字符-、空格这些字符。当用户输入带这类字符的内容时,路由系统找不到对应的匹配项,直接返回404,根本不会触发Build方法。

2. URL编码的使用错误

你之前用encodeURIComponent编码了整个URL,这会把路径里的斜杠/、点.这些关键字符也转义掉,导致服务器收到的是一串完全无法识别的路径,自然也会返回404。正确的做法应该是只编码用户输入的参数部分,而不是整个URL。


具体修改方案

第一步:调整路由约束

把alpha约束替换成能匹配你需要的字符的正则约束,比如允许字母、数字、下划线、连字符、空格:

public class HomeController : Controller { 
    // 正则约束:允许字母、数字、下划线、连字符、空格
    [GET("{name:regex(^[a-zA-Z0-9\\- _]+$)}")] 
    public ActionResult Build(string name) { 
        var model = new MyModel(name); // 修正原代码缺失的分号
        return View(model); // 修正原代码的引号错误,无需给model加引号
    } 
}

如果需要允许更多特殊字符,直接修改正则表达式里的字符集即可。

第二步:修正TypeScript的编码逻辑

只对用户输入的userinput进行编码,保持URL路径部分不变:

function callUserInput(userinput) { 
    // 仅编码用户输入的参数
    const encodedInput = encodeURIComponent(userinput);
    mycall(`./Website/Home/Build/${encodedInput}`);
}

额外提示

  • 原控制器代码里有两个小错误:new MyModel(name)后面少了分号,return View("model);的引号使用错误(应该直接传model对象,或者指定视图名+模型,比如return View("Build", model)),已经在上面的代码里修正了。
  • 如果不需要对参数做任何字符限制,可以直接去掉路由约束,写成[GET("{name}")],不过这样要注意做好参数的合法性校验,避免安全问题。

内容的提问来源于stack exchange,提问作者bssyy78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:13:50