程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了MVC 属性路由 RoutePrefix 不适用于默认路由大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决MVC 属性路由 RoutePrefix 不适用于默认路由?

开发过程中遇到MVC 属性路由 RoutePrefix 不适用于默认路由的问题如何解决?下面主要结合日常开发的经验,给出你关于MVC 属性路由 RoutePrefix 不适用于默认路由的解决方法建议,希望对你解决MVC 属性路由 RoutePrefix 不适用于默认路由有所启发或帮助;

我有一个变通方法,但我真的很想知道为什么这在 MVC 中似乎不起作用。 (.Net 4.6.1)

我有一个控制器,我想使用 RoutePrefix:

[RoutePrefix("entry")]
public class DefaultController : Controller
{
    [httpGet]
    [Route(),Route("Index")]
    public ActionResult Index()
    {
        // ...
    }
}

在路由配置中:

routes.IgnoreRoute("{resourcE}.axd/{*pathInfo}");

routes.MapMvcAttributeRoutes();

routes.MapRoute(
    name: "Default",url: "{Controller}/{action}/{ID}",defaults: new { controller = "entry",action = "index",ID = UrlParameter.optional }

问题在于,使用此配置,在本地 IIS 下运行进行测试,导航到“localhost/testApp/entry”有效,“localhost/testApp/entry/index”有效,但是默认的“localhost/testApp/”结果在 404 中。

这让我很头疼,因为在一个带有默认控制器且默认设置为“home”和“index”的新项目中,“localhost/testApp”可以毫无问题地呈现 Home/Index。

我将范围缩小到 RoutePrefix 是问题所在。如果我删除 RoutePrefix 并将默认值更改为:new { controller = "default",ID = UrlParameter.optional }

然后 "localhost/testApp" 工作,但显然这需要对其他路由使用 /default 而不是 /entry。

此外,如果我保留前缀(将默认控制器切换回“entry”)并将 Route("~/") 添加到 Index 方法,那么“localhost/testApp”也可以根据确认 ~ 路由覆盖了路由前缀。

我想知道是否有解释为什么 RoutePrefix 似乎与默认路由不兼容?我可以为该默认操作添加 ~/ 路由,但似乎我对如何使用 RoutePrefix 缺少一些了解。

解决方法

动作属性路由具有最高优先级。如果您使用它,则只有路由属性有效,其他所有内容都将被忽略。您可以根据需要对任意多条路线执行一项操作。

由于您有 2 个变体 - Route() 和 Route("Index"),它仅适用于 2 个 url -"localhost/testApp/entry" 和 "localhost/testApp/entry/index"。

如果您删除 Route() 它将仅适用于一个 url-lcalhost/testApp/entry/index"。

如果你添加第三条路由("~/") 它将适用于第三个 url "localhost/testApp" 符号 ~ 表示应该忽略任何前缀,它从根开始。

所以你不能在 Index action 上使用默认的常规路由,因为它只服从路由属性。

此外,您也有一个控制器 [RoutePrefix("entry")] 属性路由,它是下一个最高优先级,因此它会覆盖您在配置文件中的约定路由。这就是默认路由不适用于此控制器并且它不会自动转到索引的原因。要使默认路由工作,您需要删除路由前缀并修复网络配置

defaults: new { controller = "default",action = "index",id = UrlParameter.optional }

当前的默认控制器 = "entry" 根本不存在。

因此,您有两种选择将 Index 作为默认路由操作 - 删除所有属性路由并丢失所有其他额外路由或添加更多路由。

,

感谢 Serge 帮助指出我对 [RoutePrefix] 的错误假设。这里的问题是 [RoutePrefix] 不是控制器的替代名称(尽管它在表面上是这样的),而是每个单独操作的前缀。然 URL 中的映射将相同:

示例 1:

public class EntryController
{
    public ActionResult Index() { ... }
}

示例 2:

[RoutePrefix("Entry")]
public class DefaultController
{
    [Route("Index")]
    public ActionResult Index() { ... }
}

这两个示例都会解析“localhost/testApp/entry/index”,但是只有第一个映射会被视为匹配 {Controller}/{action} 并解析“entry/index”的“defaults”映射”。

因此,如果一个动作 /w 基于属性的路由需要被设为根默认值,如果没有 [Route()] 或 [Route(" ~/")] 如果有 [RoutePrefix]。因为它不会包含在 {Controller}/{action} 路由中。 (通过完全删除默认的 {Controller}/{action} 路由来验证)。

大佬总结

以上是大佬教程为你收集整理的MVC 属性路由 RoutePrefix 不适用于默认路由全部内容,希望文章能够帮你解决MVC 属性路由 RoutePrefix 不适用于默认路由所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。