使用不同的ActionResult处理额外的MVC参数

时间:2013-02-13 16:41:55

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 routing

我正在开发一个有4个独立部分的网站,每个部分都有自己的控制器。这些控制器共享一些模型,但是根据调用它的控制器,模型会略微不同。

我想要关注的路线是{controller}/{model}/{id}/{action},因此我可以使用controller1/cars/5/edit而不是controller1/editcar/5

有没有办法让我的控制器理解模型+动作组合并使用不同的ActionResults处理它们,或者我被迫在模型名称上使用ActionResult然后使用条件来确定要采取的操作? / p>

在Ruby中,我可以使用get "/controller1/cars/:id/edit" do。我只是在MVC4中寻找类似的东西。

示例路径:

  • /controller1/cars
    • (返回包含来自controller1的所有汽车的视图)
  • /controller1/cars/5
    • (返回包含来自controller1的ID为5的汽车的视图)
  • /controller1/cars/5/edit
    • (返回视图以编辑来自controller1的ID为5的汽车)
  • /controller2/cars
    • (返回包含来自controller2的所有汽车的视图)
  • /controller2/boats
    • (返回包含来自controller2的所有船只的视图)

2 个答案:

答案 0 :(得分:1)

我认为这条路线符合您的需求。它需要在您的操作方法中使用一些聪明的逻辑,但应该为您提供处理它的工具。阅读我对行为的描述。

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{model}/{id}/{action}", // URL with parameters
            new { controller = "Home", action = "View", id = UrlParameter.Optional } // Parameter defaults
        );
  • 此路由将默认为名为View的操作(可能用于显示),并且可以选择指向其他操作。
  • Modelid将作为参数传递给您的操作方法。不幸的是,Model不会作为类型发送,而是作为字符串发送(您可以将其提供给Factory类)。
  • 如果遗漏了if(例如/controller2/boats),它将作为null传递给您的操作。这需要处理逻辑,但为您提供了处理它的工具。

答案 1 :(得分:0)

感谢您的回复。我遇到这么多麻烦的原因是因为我无法弄清楚如何正确地将控制器与路径分开。这导致我的想法脱离了MVC标准,几乎试图实现控制器控制器。

当我最终偶然发现“区域”时,我很快意识到这就是我所需要的。我能够为我的网站的每个部分(或区域)添加一个区域,并且在每个区域内,我可以定义单独的控制器和视图,而我的模型保留在所有区域之外的共享目录中。这现在完美无缺。