MVC 使用参数路由到三个不同的控制器

MVC Route to three different controllers with parameter

我有一个项目,它具有三个不同的控制器,用于税收、销售、天然气和公用事业。当我从 http://localhost/tax/salestax 之类的菜单中调用一个时,它会很好地转到 Index 方法。路由配置是这样的:

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

这在调用创建新条目的方法时工作正常,但在调用已从具有交易编号的列表中输入的条目时失败。

 public ActionResult Index(long? id)
 { 
    if (id = null) 
    {
       return newTaxRequest();
    }
    return existingTaxRequest(id.ToString());
 }

当使用参数调用时,页面甚至不会在索引处中断:

http://localhost/tax/salestax/500030

Home控制器Index动作方法很简单:

   public ActionResult Index()
   {
      return View();
   }

如何配置控制器操作或路由映射来解决此问题?

好的,这里的前辈把路线改成:

 salestax/{id}

通过 "Index" 的操作,这确实让我看到了创建的 trans。他为其他两种类型添加了两条路线。但是,现在我无法创建一个新的,因为它总是在无限循环中返回到索引。如果我将其更改为:

 salestax/{action}/{id}

我可以创建一个新的翻译,但无法看到创建的翻译,错误是 http://localhost/tax/salestax/500030 找不到。

还有其他想法吗?

MVC 无法计算出应该调用哪个操作,因为它们可能具有相同的签名 - 您的 ID 可以为 null 并且在您的路由设置中设置为可选,因此如果没有传递 ID,它不会'不知道是把请求发给Index()还是Index(long?id).

您可以删除不带 id 的 Index() 并让您的 Index(long?id) 方法执行这两个操作,最初只检查空值。

您发布的代码使用了问题中从未定义的非标准方法,因此在一定程度上无法知道可能是什么问题。此外,您提到了三个控制器,但只有您发布的默认路由,您使用的 URLs 不可能达到任何一个。正如路线所说,URL 将被解释为 /{controller}/{action}/{id}id 是可选参数。因此,对于像 /tax/salestax/500030 这样的 URL,将实例化名为 TaxController 的控制器,并调用该控制器内的操作 SalesTax,参数为“500030” id。这意味着您的代码必须类似于:

public class TaxController : Controller
{
    public ActionResult SalesTax(long? id)
    {
        ...
    }
}

如果您确实有 3 个独立的控制器,那么您的 URL 需要考虑到这一点,即 /sales/tax/gas/tax/utility/tax,其中每个控制器都会然后有一个名为 Tax 的动作。或者,如果您希望它们都在 /tax 前缀下,您可以添加另一条路线:

routes.MapRoute(
    name: "Tax",
    url: "tax/{controller}/{action}/{id}",
    defaults: new { controller = "Sales", action = "Index", id = UrlParameter.Optional }
);

然后,你可以有一个像 /tax/sales 这样的 URL,它会默认调用 SalesControllerIndex 动作。