ASP.Net 路由问题

ASP.Net Routing Issues

我是 MVC 的新手,环顾四周,没有什么能完全满足我的需求。

这是我希望设置路线的方式:

domain/{action}
domain/{username}/{action}
domain/{username}

(用户名代替id) 所有三个都使用相同的控制器。

如果我输入所有三个,它应该会为我加载页面

这是我原来的。它不起作用。我有 URL.Action 方法为我创建 links,但他们没有正确创建它们。我尝试切换顺序,但问题仍然存在,这意味着我在概念上遗漏了一些关于路由的内容。

这是我原来的

routes.MapRoute(
    "WithUsername","{username}",
    new { controller = "Home", action = "Landing"}
);
routes.MapRoute(
    "WithOutUsername",
    "{action}",
    new { controller = "Home", action = "Landing"}
);

routes.MapRoute(
    "Default",
    "{username}/{action}",
    new {controller = "Home", action = "Landing"}
);

谁能指引我正确的方向?

这里有一个例子说明 link 是如何搞砸的。假设我单击 Url 将我带到学习资源。 URL.Action 指向学习资源操作。没有重复的名字。

这是URL.Action

<a href="@Url.Action(title.actionName, title.controllerName, new {Model.username})">@title.name</a>

而不是得到这个

domain/LearningResources

我明白了

domain/LearningResources?username=LearningResources

它以某种方式将 LearningResources 检测为用户名,即使没有用户名。我所有的操作都将用户名作为可选参数(设置为字符串 username = ""),所以它似乎混淆了什么是用户名和什么是操作,因为如果我在 URL手动它按预期工作。

如果我最初只使用域作为我的地址,它似乎只会搞砸。如果我从 domain/{action} 或 domain/{username} 开始,所有 link 都会相应地工作。

解决方法是将域重新路由为始终是域/{action}吗?

好的,所以解决这个问题非常简单。感谢 NightOwl888 的帮助。

一个是用户名将始终采用 "word.word" 的格式。操作永远不会有句号,所以我可以使用 Regex 来检查它并相应地路由。

其次,可以设置特定的操作路径。假设我有两个不同的控制器,但我仍然希望拥有相同的功能。如果 url 中没有控制器,MVC 就无法自动知道我指向的是哪个控制器。

所以我找到的解决方案是为 Actions 制定特定的路线。

因此,如果我有一个名为 Resources 的操作,并且它在名为 NotHome 的控制器中,我可以使我的路线如下所示:

routes.MapRoute(
    "Resources",
    "{username}/Resources",
    new { controller = "NotHome", action = "Resources"}
);

所以现在每次我输入 whatever/Resources,它都会到达那条路线。