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,它会默认调用 SalesController
的 Index
动作。
我有一个项目,它具有三个不同的控制器,用于税收、销售、天然气和公用事业。当我从 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,它会默认调用 SalesController
的 Index
动作。