如何在MVC3应用程序中命名/划分控制器

时间:2011-09-15 09:47:52

标签: c# asp.net-mvc-3 controller routes

目前我有3个控制器:Home,Summary和Detail 但是,每个只有一个动作:索引,显示和显示。

这对我来说很难闻。

我希望使用MapRoute来允许:

myapp/Home
myapp/Summary/prop1/prop2
myapp/Detail/prop1/prop2/prop3

而不是

myapp/Home
myapp/Summary/Display/prop1/prop2
myapp/Detail/Display/prop1/prop2/prop3

从而错过了“显示”部分...但是再一次,这闻不对劲。虽然它有效,但它意味着手动添加链接而不是使用Html.ActionLink(...)

将Home / Index,Home / Summary和Home / Detail都集中在一个控制器中会更好吗?

我希望提供一个简单的URL结构,以便知道他们正在做什么的用户可以简单地按上面的方式输入...“Home”部分似乎浪费了?

5 个答案:

答案 0 :(得分:0)

不确定我是否完全接受了您的问题,但是如何创建一个继承自Controller的基本控制器类,并在那里进行共享操作呢?这样你就不需要重复自己了。

答案 1 :(得分:0)

你只需要一个控制器,里面有多个动作..

public class HomeController:Controller     {

 public ActionResult Index()
    {

}

 public ActionResult Summary()
    {

}

 public ActionResult Details()
    {

} }

在动作链接中

@ Html.ActionLink(“详细信息”,“详细信息”,“主页”);

这就够了,不需要添加多个控制器..

希望这些有帮助..

答案 2 :(得分:0)

在谈到这个问题时,你几乎可以找到你想要的任何路线,这一切都取决于你想要达到的目标。

您可以将所有操作都放在Home控制器中,这样您的路线就可以

myapp/Home
myapp/Home/Summary/prop1/prop2 
myapp/Home/Details/prop1/prop2/prop3 

在此选项中,您有1个控制器,3个操作,以及2个其他路径来处理URls

这取决于摘要和详细信息的内容?如果它是订单的摘要,我宁愿

myapp/Orders/Summary/prop1/prop2
myapp/Orders/Details/prop1/prop2/prop3

在此您将拥有Home控制器和Index操作,然后是具有两个操作的Orders控制器。我会说,摘要和细节通常会建议你显示一些东西,所以你不需要像你的建议中那样使用“显示”部分。

答案 3 :(得分:0)

如果您希望您的网址

myapp/Home 
myapp/Summary/prop1/prop2  
myapp/Detail/prop1/prop2/prop3

然后你制作3个控制器

HomeController的 SummaryController DetailController

每个都有1个动作

  

public ActionResult Index(){

     

}

对于SUmmary和Detail控制器,您只需将一些额外的参数传递给Index动作

答案 4 :(得分:0)

我同意@Tim你应该使用一个控制器。控制器是动作的逻辑分组;例如Foo的CRUD操作。 NerdDinner就是一个很好的例子。

我不同意这些路线。你可以用路由做任何你想做的事情;但它应该对用户有意义。你可能只有一条与下面相似的单一路线。

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

您可以使用单个控制器获得所需的路线。

您想要的网址:

  

的myapp /主页
  的myapp /概述/ PROP1 / PROP2
  的myapp /详细内容/ PROP1 / PROP2 / prop3

控制器设置:

public class HomeController : Controller 
{
     public ActionResult Index() { ... }

     public ActionResult Summary() { ... }

     public ActionResult Details() { ... } 
}

路由设置:

 routes.MapRoute("Home-Index",      //RouteName
   "myapp/Home", //RouteUrl
   new {                         //RouteDefaults
       controller = "Home", 
       action = "Index"});

 routes.MapRoute("Home-Summary",      //RouteName
   "myapp/Summary/prop1/prop2", //RouteUrl
   new {                         //RouteDefaults
       controller = "Home", 
       action = "Summary",
       prop1 = UrlParameter.Optional,
       prop2 = UrlParameter.Optional});

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

现在有一些重要的事情需要注意:

  1. 路由的工作方式类似于switch语句,匹配的第一个url是 它将使用的那个,这就是为什么你把它作为最后一个 之一。

  2. 地图路线中定义的网址可以是您想要的任何内容。它 不必与控制器匹配,因为一旦你删除 占位符({controller}等)它使用默认值 导航。所以Home-Index路线网址可能是myapp / foo / bar / baz 并且id仍会将您带到Home索引操作。

  3. 占位符自动运行。我无法找到解释默认路由如何工作的好资源。

  4. 希望这有帮助。