Asp.net mvc 3 ASP.NET MVC 3控制器路由-使主控制器下的所有内容显示在域下

Asp.net mvc 3 ASP.NET MVC 3控制器路由-使主控制器下的所有内容显示在域下,asp.net-mvc-3,Asp.net Mvc 3,当前,homecontroller下的所有内容在URL中显示为 example.com/Home/{Action} 有没有一种方法,我们可以保持所有其他路由的方式,但只有特殊情况下的家庭控制器,所以在家里的一切都属于域 像 而不是为每个控制器创建新的控制器类 编辑: 另一个URL类似于 example.com/user/details/123 example.com/user/edit/123 userController中的控件应与现在的控件工作相同。您只需修改默认路由并从url中删除控制

当前,homecontroller下的所有内容在URL中显示为

example.com/Home/{Action}
有没有一种方法,我们可以保持所有其他路由的方式,但只有特殊情况下的家庭控制器,所以在家里的一切都属于域

而不是为每个控制器创建新的控制器类

编辑:

另一个URL类似于

example.com/user/details/123
example.com/user/edit/123

userController中的控件应与现在的控件工作相同。您只需修改默认路由并从url中删除控制器位,并在默认值中指定它将始终为
Home

routes.MapRoute(
    "Default",
    "{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

显然,您意识到这将您的应用程序限制为单个控制器,即
HomeController
,因为现在您不再有任何可能在url中设置它。将所有操作塞入一个控制器是一种糟糕的做法,它违反了RESTful路由和SRP等原则。

我认为最好的方法是:

 routes.MapRoute("home", "home", new { controller = "Home", action = "Index" });
 routes.MapRoute("about", "about", new { controller = "Home", action = "About" });
 routes.MapRoute("contact", "contact", new { controller = "Home", action = "Contact" });

 routes.MapRoute(
     "Default", // Route name
     "{controller}/{action}/{id}", // URL with parameters
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
 );
如果要创建链接,请使用:

@Html.RouteLink("Home", "home", new{/* route values */}, new {/* html attribues */})
或:

而不是:

@Html.ActionLink("Home", "Index", "Home", new{/* route values */}, new {/* html attribues */})
这对我有用,对你也应该有用

更新:

您可以在url中的
操作
部分之前创建一个符号,如
@
(或
-
或其他任何符号),以使url唯一,例如:

routes.MapRoute(
    "test",  // route name
    "@{action}", // url and parameters
    new {controller = "MyHome", action = "Home"} // parameter defaults
    );
routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
     );
通过这种方式,您的URL与默认地图路径不同,您可以创建如下URL:

site.com/@Home
site.com/@About
site.com/@Contact

但在我看来,第一个更好,我总是使用它。

使用MVC5的属性路由,我做了类似于Javad_Amiry answer的事情,在HomeController中为每个动作放置一个路由:

public class HomeController : Controller
{
    [Route("about")]
    public ActionResult About()
    {
        return View();
    }

我认为这比将每个操作都放在全局RouteConfig.cs文件中更易于维护。更好的做法是将属性路由与基于约定的路由相结合,这样添加到控制器的新操作在默认情况下将在没有路由属性(例如:/Home/action)的情况下工作,但可以通过添加路由属性(例如:/action)来改进。

是的,这就是问题的原因。。如何特例一个控制器,这样我就不必创建一吨控制器。谢谢。@MoXplod,在我的回答中,我向您展示了如何修改global.asax中的默认路由并从url中删除
{controller}
位。是的,这是一种特殊情况,但会中断到所有其他控制器的路由。我需要所有其他人都像他们现在那样工作。@MoXplod,我想你完全没有领会我回答的要点。您不能有其他具有此类路由的控制器:-)您希望路由引擎如何知道要从以下url调用哪个控制器?如果你想拥有除Home之外的其他控制器,必须有某种方法在url中指定它们。这就是我刚刚发现并开始做的。这对我很有用。。除了actionlink对我来说也正常工作。(它给出了所需的URL)但是如果有人有另一种聪明的方法,这样我们就不必为我添加到主控制器的每个操作重复这些代码行,那就太好了。我现在将此标记为一个答案,另一种方法(对于您的第二条评论)是在操作部分之前创建一个符号(例如@或-或其他任何东西),我将在答案的更新中插入一个这样的示例。这是一个非常好的解决方案-我可能最终使用u或其他什么.routes.MapRoute(“默认值”,“{action}”,new{controller=“Home”,action=“{action}”});这个解决方案看起来很好,很干净,但是性能呢,每个请求都要经过反射来确定根。但这可以通过缓存控制器字典(该解决方案没有显示)来解决。我同意,尝试过这个方法,它对我非常有效。注意:确保在RouteConfig.cs:
routes.mapmvCattributerRoutes()中启用属性路由
site.com/@Home
site.com/@About
site.com/@Contact
public class HomeController : Controller
{
    [Route("about")]
    public ActionResult About()
    {
        return View();
    }