我有一个项目,有三个不同的税收控制器,销售,燃气,公用事业。当我从像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控制器索引操作方法很简单:
public ActionResult Index()
{
return View();
}
如何配置控制器操作或路线图以解决此问题?
好的,这里的老人改变了路线:
salestax/{id}
使用"索引"的动作,这允许我看到创建的trans。他为其他两种类型增加了两条路线。但是,现在我无法创建一个新的,因为它总是回到索引,在一个无尽的循环中。如果我将其更改为:
salestax/{action}/{id}
我可以创建一个新的trans,但无法看到创建的一个带有http://localhost/tax/salestax/500030无法找到的错误。
还有其他想法吗?
答案 0 :(得分:0)
MVC无法确定应该调用哪个操作,因为它们都可能具有相同的签名 - 您的ID可以为空并且在路由设置中设置为可选,因此如果没有传递id,则它不会被'知道是否将请求发送到Index()或Index(long?id)。
您可以删除不带ID的Index(),并且您的Index(long?id)方法都支持这两种操作,只是最初检查一个空值。
答案 1 :(得分:0)
您发布的代码使用的是从未在问题中定义的非标准方法,因此在某种程度上无法知道问题所在。此外,您提到了三个控制器,但只有您发布的默认路由,您使用的URL无法触及其中任何一个。正如路线所说,URL将被解释为/{controller}/{action}/{id}
,其中id
是可选参数。因此,对于像/tax/salestax/500030
这样的URL,将实例化名为TaxController
的控制器,并且将调用该控制器中的操作SalesTax
,参数为“500030”,用于{{1 }}。这意味着您的代码必须类似于:
id
如果您确实拥有3个独立的控制器,那么您的网址需要考虑到这一点,即public class TaxController : Controller
{
public ActionResult SalesTax(long? id)
{
...
}
}
,/sales/tax
,/gas/tax
,其中每个控件都会有一个名为{的动作{1}}。或者,如果您希望它们都在/utility/tax
前缀下,则可以添加另一条路径:
Tax
然后,您可以使用/tax
这样的网址,默认情况下会调用routes.MapRoute(
name: "Tax",
url: "tax/{controller}/{action}/{id}",
defaults: new { controller = "Sales", action = "Index", id = UrlParameter.Optional }
);
的{{1}}操作。