ASP.NET MVC迁移至Core:如何用正则匹配T4MVC的MVC.Xxx.Yyy()调用?
解决ASP.NET MVC到Core迁移中
Url.Action(MVC.X.Y())的正则匹配问题 我之前做过类似的ASP.NET MVC到Core的迁移工作,刚好碰到过这个正则匹配的坑!你的原正则"(MVC.)(.*?)(\\(\\))"问题在于它没有区分控制器和动作方法这两个关键部分,只是笼统地匹配了MVC.到()之间的所有内容,自然没法直接用来替换成Url.Action("动作", "控制器")的格式。
正确的正则表达式方案
针对你需要的MVC.Foo.Bar()或MVC.Foo.Bar.Baz()(后者通常是带区域的场景,比如Area.Controller.Action)格式,我们可以用以下正则来精准捕获控制器和动作:
匹配完整的Url.Action(MVC.X.Y())调用
如果你要批量替换整个Url.Action调用,可以用这个正则:
Url\.Action\(MVC\.([\w.]+)\.(\w+)\(\)\)
对应的替换内容是:
Url.Action("$2", "$1")
正则各部分解释
Url\.Action\(:精准匹配Url.Action(,转义.和(是因为它们在正则里是特殊字符MVC\.:匹配固定前缀MVC.([\w.]+):第一个捕获组,匹配控制器部分(允许包含.,支持Area.Controller这种带区域的格式)\.:匹配控制器和动作之间的分隔点(\w+):第二个捕获组,匹配动作方法名称(只能是字母、数字和下划线,符合C#方法名规则)\(\)\):匹配结尾的()和外层的)
替换示例
原代码:
Url.Action(MVC.Account.ResetPasswordCode())替换后:
Url.Action("ResetPasswordCode", "Account")原代码:
Url.Action(MVC.Admin.User.Edit())替换后:
Url.Action("Edit", "Admin.User")
扩展:处理带参数的情况
如果你的代码里还有带参数的调用(比如MVC.Account.ResetPasswordCode(code)),可以稍微调整正则来兼容:
Url\.Action\(MVC\.([\w.]+)\.(\w+)\((.*?)\)\)
替换内容改成:
Url.Action("$2", "$1", new { $3 })
这样就能保留原有的参数,转换成Core里的路由值对象格式。
内容的提问来源于stack exchange,提问作者Ahmad1334
相关产品推荐
相关产品推荐

