Routing MVC4 Web API忽略参数
试图在VisualStudio2010中使用MVCRC4WebAPI建立一个新站点,但似乎不起作用:参数值从未传递给该方法 据我所知,我所做的一切都与这里描述的一模一样: 路由配置:Routing MVC4 Web API忽略参数,routing,asp.net-mvc-4,asp.net-web-api,Routing,Asp.net Mvc 4,Asp.net Web Api,试图在VisualStudio2010中使用MVCRC4WebAPI建立一个新站点,但似乎不起作用:参数值从未传递给该方法 据我所知,我所做的一切都与这里描述的一模一样: 路由配置: routes.Clear(); routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}
routes.Clear();
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new {
id = RouteParameter.Optional
}
);
下面是常规的MVC路线,我也尝试过完全删除它,看看是否有
有些冲突,但没有什么区别
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
测试控制器:
public class TestController : ApiController
{
[HttpGet]
public int Double(int value)
{
return value * 2;
}
}
URL:http://localhost:1505/api/test/double/4
The parameters dictionary contains a null entry for parameter 'value' of
non-nullable type 'System.Int32' for method 'Int32 Double(Int32)' in
'MyAppName.Controllers.TestController'. An optional parameter must be a
reference type, a nullable type, or be declared as an optional parameter.
啊。这是很简单的,不是吗?但似乎没有任何结果导致参数被映射。见鬼,我也试过了
http://localhost:1505/api/test/double?id=4
没有区别。如果我让参数接受空值,例如
public int Double(int? value)
它运行,但值
始终为空
我做错了什么 在路由中,您有
{id}
,但在操作中,您有值
,MVC按名称匹配“事物”(路由值、查询字符串值等)
因此,名称应该对齐:
因此,请将您的路线更改为:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{value}",
defaults: new {
value= RouteParameter.Optional
}
);
它将与URL一起工作:http://localhost:1505/api/test/double/4
The parameters dictionary contains a null entry for parameter 'value' of
non-nullable type 'System.Int32' for method 'Int32 Double(Int32)' in
'MyAppName.Controllers.TestController'. An optional parameter must be a
reference type, a nullable type, or be declared as an optional parameter.
注意:如果保留值
路由参数。可选
,则需要将操作签名中的类型更改为int?
或者,您可以更改操作方法签名:
[HttpGet]
public int Double(int id)
{
return id * 2;
}
或者您可以保持原样,只需使用以下URL:
http://localhost:1505/api/test/double?value=4
在您的路线中,您有{id}
,但在您的操作中,您有值
,MVC按名称匹配“事物”(路线值、查询字符串值等)
因此,名称应该对齐:
因此,请将您的路线更改为:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{value}",
defaults: new {
value= RouteParameter.Optional
}
);
它将与URL一起工作:http://localhost:1505/api/test/double/4
The parameters dictionary contains a null entry for parameter 'value' of
non-nullable type 'System.Int32' for method 'Int32 Double(Int32)' in
'MyAppName.Controllers.TestController'. An optional parameter must be a
reference type, a nullable type, or be declared as an optional parameter.
注意:如果保留值
路由参数。可选
,则需要将操作签名中的类型更改为int?
或者,您可以更改操作方法签名:
[HttpGet]
public int Double(int id)
{
return id * 2;
}
或者您可以保持原样,只需使用以下URL:
http://localhost:1505/api/test/double?value=4
当我没有定义属性[RoutePrefix(“”)和[Route(“”)时,这种情况会发生在我身上用于我的控制器和web api中的操作方法。添加这些之后,它对我非常有效。当我没有定义属性[RoutePrefix(“”)]和[Route(“”)时,这种情况会发生在我身上用于我在web api中的控制器和操作方法。添加它们后,它对我非常有效。那么基本上,方法中的参数名称必须与模板中使用的名称匹配?这是否意味着我必须为每一个可能的方法创建一个路由,即使它与现有模式匹配(或者使用ID作为我的参数名,不管是什么)?呃..@jamietre这有点过于简单了,但是是的。在MVC和Web.API中,名为ModelBinder的组件负责将传入数据(路由参数、查询字符串、来自集合)与参数对象进行匹配。它和他们的名字匹配。如果您需要更多信息,可以搜索ModelBinder和ValueProviders。谢谢。行。似乎不寻常的是,它通过实际的参数名匹配,而不仅仅是签名,这有点违背了模板的目的!因此,基本上,方法中的参数名称必须与模板中使用的名称匹配?这是否意味着我必须为每一个可能的方法创建一个路由,即使它与现有模式匹配(或者使用ID作为我的参数名,不管是什么)?呃..@jamietre这有点过于简单了,但是是的。在MVC和Web.API中,名为ModelBinder的组件负责将传入数据(路由参数、查询字符串、来自集合)与参数对象进行匹配。它和他们的名字匹配。如果您需要更多信息,可以搜索ModelBinder和ValueProviders。谢谢。行。似乎不寻常的是,它通过实际的参数名匹配,而不仅仅是签名,这有点违背了模板的目的!