【问题标题】:How to name/divide controllers in MVC3 application如何在 MVC3 应用程序中命名/划分控制器
【发布时间】:2011-11-17 17:45:46
【问题描述】:

目前我有 3 个控制器:Home、Summary 和 Detail 但是,每个都只有一个动作:分别是 Index、Display 和 Display。

这味道对我不好。

我希望使用 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 结构,以便知道自己在做什么的用户可以像上面一样简单地输入它......“主页”部分似乎浪费了?

【问题讨论】:

  • 为什么非要手动写链接而不是Html.ActionLinkHtml.ActionLink 总是反向查找您的路线并提供正确的 uri。您需要做的就是编辑您的路线配置。

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


【解决方案1】:

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

我不同意这些路线。你可以对路由做任何你想做的事情;但它应该对用户有意义。您可能只有一条类似于下面的包罗万象的路线。

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

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

您想要的网址:

我的应用程序/主页
我的应用程序/摘要/prop1/prop2
myapp/Detail/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. 在您的地图路线中定义的 url 可以是任何您想要的。它 不必与控制器匹配,因为一旦删除 它使用默认值的占位符({controller} 等) 导航。所以 Home-Index 路由 url 可能是 myapp/foo/bar/baz 并且 id 仍会将您带到 Home 索引操作。

  3. 占位符自动工作。我找不到一个很好的资源来解释默认路由是如何工作的。

希望这会有所帮助。

【讨论】:

  • 我认为这符合我的要求:拥有多个控制器或每次都有一个带有“Home”的 URL 似乎很疯狂,而这并不是必需的,也没有增加任何价值。
  • 如果你走这条路,你的路由会变得太复杂。最佳实践是尽可能使用标准路由并为每个路由创建不同的控制器。这样,您的页面名称直接映射到您的文件夹结构
  • @Daveo 我同意您通常希望使用默认路由。我不同意为了路由而创建新控制器是最佳实践。例如,为每个 CRUD 功能创建一个新控制器是没有意义的,只是为了让您可以拥有自定义路由。此外,虽然创建自定义路由可能会变得很复杂,但我宁愿在一个位置拥有多个路由,而不是在多个控制器之间散布相关代码。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您只需要一个控制器并在其中执行多个操作..

    公共类 HomeController : 控制器 {

     public ActionResult Index()
        {
    

    }

     public ActionResult Summary()
        {
    

    }

     public ActionResult Details()
        {
    

    } }

    在动作链接中

    @Html.ActionLink("Details", "Details","Home");

    够了,不用加多个控制器了..

    希望这些有帮助..

    【讨论】:

      【解决方案4】:

      在这方面你几乎可以走任何你想要的路线,这一切都取决于你想要实现的目标。

      您可以将所有操作粘贴在 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 控制器。我会说摘要和详细信息通常会建议您无论如何都在显示某些内容,因此您不需要像您的建议中那样使用“显示”部分。

      【讨论】:

        【解决方案5】:

        如果你希望你的网址是

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

        然后你制作 3 个控制器

        主控制器 摘要控制器 细节控制器

        每个都有 1 个操作

        公共行动结果索引(){

        }

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

        【讨论】:

        • 也许我的路由错了:当我尝试这个时它认为 Prop1 是动作?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多