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

本文关键字:MVC 参数 处理 ActionResult | 更新日期: 2023-09-27 17:58:54

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

我想遵循的路线是{controller}/{model}/{id}/{action},所以我可以使用controller1/cars/5/edit而不是controller1/editcar/5

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

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

路由示例:

  • /controller1/cars
    • (从控制器1返回包含所有汽车的视图)
  • /controller1/cars/5
    • (从控制器1返回包含ID为5的汽车的视图)
  • /controller1/cars/5/edit
    • (从控制器1返回一个视图以编辑ID为5的汽车)
  • /controller2/cars
    • (从控制器2返回包含所有汽车的视图)
  • /controller2/boats
    • (从控制器返回包含所有船只的视图2)

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

我认为这条路线符合您的需求。它需要你的行动方法中有一些巧妙的逻辑,但应该给你处理它的工具。阅读我对行为的描述。

        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传递给您的操作。这需要逻辑来处理,但为您提供了处理它的工具

感谢您的回复。我之所以在这方面遇到这么多麻烦,是因为我不知道如何正确地将控制器与路由分开。这导致我的想法脱离了MVC标准,几乎试图实现一个控制器的控制器。

当我最终偶然发现"领域"时,我很快意识到这正是我所需要的。我可以为我的网站的每个部分(或区域)添加一个区域,在每个区域内,我可以定义单独的控制器和视图,而我的模型保留在所有区域之外的共享目录中。这现在非常有效。