我正在使用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 }
);
我做错了什么?
答案 0 :(得分:1)
在此上下文中,GetData
被调用,因为它的前缀为Get
。有一种约定将HTTP GET映射到前缀为Get
的函数,HTTP POST映射到PostXXX
等等。GetData
正在通过默认的HTTP路由解析,该路由指定了一个可选的{{1} }参数,并且不在预期的id
网址示例中(这是您想要的)。
由于GetData
中的MapHttpRoute
参数尚未默认为id
,因此示例中的routeTemplate
不会匹配。实际上不需要此路由 - 您不需要在此路由定义中包含查询字符串参数。查询字符串参数只是映射到传递给操作的参数(在您的情况下为RouteParameter.Optional
)。
因为offline
没有像我上面提到的HTTP动词之一那样作为前缀,所以它与默认的HTTP路由不匹配。要解决您的问题,您只需要做两件事:
MarkOnline
。这不是必需的,因为我已经提到的默认HTTP路由将涵盖您的用例。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