【问题标题】:MVC Route to three different controllers with parameterMVC 使用参数路由到三个不同的控制器
【发布时间】:2015-02-04 18:17:19
【问题描述】:

我有一个项目,其中包含三个不同的税收、销售、天然气、公用事业控制器。当我从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}

通过“索引”的操作,我可以看到创建的反式。他为其他两种类型增加了两条路线。但是,现在我不能创建一个新的,因为它总是回到索引,在一个无限的循环中。如果我将其更改为:

 salestax/{action}/{id}

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

还有其他想法吗?

【问题讨论】:

  • 同意@dotnetom,您发布的不是有效代码,因此很难猜测可能有什么问题。使用您正在执行的实际代码更新您的帖子。如果控制器不是太大,那么查看控制器上的其他方法也会有所帮助。
  • 如果这是配置的唯一路由,那么http://localhost/tax/salestax 将无法转到Index 控制器的Index 操作。它将调用tax 控制器的salestax 操作。因此,尝试转到http://localhost/tax/500030 - 这应该使用参数调用Index 操作。家庭控制器,它的 Index 操作与您的问题无关。

标签: asp.net-mvc-4


【解决方案1】:

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

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 操作。

【讨论】:

  • 我对问题进行了一些修改。基本上,当我将其设置为转到现有的 trans 时,我无法创建新的 trans。如果我设置它来创建一个新的,我看不到旧的。
【解决方案2】:

MVC 无法确定应该调用哪个操作,因为它们都可能具有相同的签名 - 您的 id 可以为空,并且在您的路由设置中设置为可选,因此如果没有传递 id,它不知道是否将请求发送到 Index() 或 Index(long?id)。

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

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多