ASP.NET MVC新路由不起作用

时间:2017-08-22 19:40:09

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我正在使用ASP.NET MVC,我正在尝试为这样的参数创建一个新路由:

NOT

这是我的方法调用我试图在我的API控制器中使用

 SELECT *
 FROM member M 
 JOIN the_schedule_table S
   ON M.mate = S.id
 WHERE NOT (S.start_date < @end_date AND S.end_date > @start_date)
   AND ( { Haversine formula } ) < @distance
   AND M.member = @member_id

然而返回的是我在API控制器中的Entity Framework GetData方法,即:

 config.Routes.MapHttpRoute(
                name: "MarkOnline",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { offline = RouteParameter.Optional }
            );

我做错了什么?

2 个答案:

答案 0 :(得分:1)

在此上下文中,GetData被调用,因为它的前缀为Get。有一种约定将HTTP GET映射到前缀为Get的函数,HTTP POST映射到PostXXX等等。GetData正在通过默认的HTTP路由解析,该路由指定了一个可选的{{1} }参数,并且不在预期的id网址示例中(这是您想要的)。

由于GetData中的MapHttpRoute参数尚未默认为id,因此示例中的routeTemplate不会匹配。实际上不需要此路由 - 您不需要在此路由定义中包含查询字符串参数。查询字符串参数只是映射到传递给操作的参数(在您的情况下为RouteParameter.Optional)。

因为offline没有像我上面提到的HTTP动词之一那样作为前缀,所以它与默认的HTTP路由不匹配。要解决您的问题,您只需要做两件事:

  1. 删除您添加的MarkOnline。这不是必需的,因为我已经提到的默认HTTP路由将涵盖您的用例。
  2. MapHttpRoute属性添加到HttpGet方法中。这会导致路由在找到MarkOnline查询字符串参数时选择MarkOnline,但如果找不到则会调用offline

答案 1 :(得分:0)

您的路线配置不正确,您没有在控制器上指定默认操作。

它应该是这样的:

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

但是请注意,配置路由的顺序很重要,它应该位于默认路由配置之前:

public class AvailabilityController : Controller
{
    // GET: MarkOnline
    public void MarkOnline(string offline)
    {
        //return Json(new { isOnline = true, name=offline }, JsonRequestBehavior.AllowGet);
    }
}

作为参考,这是我的测试控制器:

http://localhost/api/availability?offline=xxx@xxx.com

var orig = [1, 2, 3]; var copy = orig; console.log(copy === orig); // ---> true var orig = [1, 2, 3]; var copy = orig.slice(); console.log(copy === orig); // ---> false

调用它