【问题标题】:.NET MVC issue with multiple routes.NET MVC 问题与多个路由
【发布时间】:2017-07-05 16:03:59
【问题描述】:

我已经在我的 .NET MVC 5 应用程序中注册了一个路由,如下所示:

 routes.MapRoute(
   "Books", // Route name
   "Books/{id}", // URL with parameters*
   new { controller = "Books", action = "Index", id = 
   UrlParameter.Optional }
   );

现在可以通过以下方式访问 Web 控制器和操作索引:

mylocalhost:8080/Books/50ShadesOfGrey

现在的问题是我有另一种方法,我用这个参数发布数据,如下所示:

  @if (Url.RequestContext.RouteData.Values["id"] != null)
   {
       @:DoScan('@Url.RequestContext.RouteData.Values["id"]');
   }

DoScan 是一个 javascript 方法,它接受书名作为参数,然后应该将书名发布到我在同一个控制器(书籍)中拥有的这个方法,它的定义如下:

  [HttpPost]
  public ActionResult LoadData(string bookName)
  {
   // method sould now be called but nothing happens??
  }

我在没有最近添加的路由的情况下对其进行了测试,并且帖子工作正常...但是当我添加此路由时,就像这个 LoadData HttpPost 方法被完全忽略了?我觉得我应该为此在路由配置中添加另一条路由,但我不确定在这里做什么?有人可以帮帮我吗?

附言

post方法中定义的路由是这样的:

/Books/LoadData/

但是操作永远不会被触发?

附:该方法通过 datatables ajax 调用被调用,如下所示:

 "ajax": {
           "url": "/Books/LoadData/",
           "type": "POST",
            "data": {
            "bookName": _bookName /*Parameter I passed through calling the function*/
           },

【问题讨论】:

  • 你能把在js中做post的代码贴出来吗,DoScan就是这样?
  • @Andrei 我已经包含了代码和解释
  • @Andrei 我应该提一下,如果没有这条新添加的路由,一切都会正常工作...添加路由时,该方法永远不会被调用...我添加的路由有问题或我需要为此方法添加另一条路线.. ?
  • 您的第一个 URL 示例是这样的:mylocalhost:8080/Books/50ShadesOfGrey 因此,如果您想要一个包含 LoadData 的不同 URL 作为您的 post 方法,您将需要注册另一个 URL。您的第一个方法看起来像 GET,因此您可以对两者使用相同的 URL,并查看使用 [FromBody] 标记而不通过 URL 传递数据。刚刚注意到您的程序被称为 LoadData ... @Andrei 的答案很好。

标签: javascript c# asp.net asp.net-mvc routes


【解决方案1】:

我敢打赌,您的配置中也有默认路由。所以实际上你有:

Books/{id}
{controller}/{action}/{id}

MVC 将选择第一个与您的请求相匹配的。 post 方法中的请求是带有一些数据的“Books/LoadData”。究竟有哪些数据并不重要,重要的是它不是 URL 的一部分。

所以“Books/LoadData”匹配第一个路由,“LoadData”是 {id}。因此,您的请求转到 Index 操作,并且不会触发 LoadData 操作。

您的意图显然是使用默认路由捕获此请求,但同样,MVC 会首先选择匹配的。

要解决此问题,您需要删除您的路线,或在其上方添加第三条

Books/LoadData
Books/{id}
{controller}/{action}/{id}

请注意,这个新路由没有 URL 参数,也不需要任何参数 - 而是在请求正文中传递数据。

【讨论】:

  • 这样的? routes.MapRoute( "LoadData", // 路由名称 "Books/LoadData", // 带参数的 URL * new { controller = "Books", action = "LoadData" } );
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多