尝试在Visual Studio 2010中使用MVC RC4 Web API设置新站点,但它似乎不起作用:参数值永远不会传递给方法。MVC4 Web API忽略参数
至于我可以告诉我所做的一切,正是因为这里描述:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
路由配置:
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;
}
}
网址: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)
它运行,但value
始终为空。
我在做什么错?
所以基本上,方法中的参数名称必须与模板中使用的名称相匹配?这是否意味着我必须为每种可能的方法创建一个路径,即使它匹配现有的模式(或者使用ID作为我的参数名称,无论如何)?呃.. – 2012-07-17 13:40:38
@jamietre这有点过分简化了,但是。在MVC和Web.API中,称为ModelBinder的组件负责将传入数据(来自集合的路由参数,查询字符串)与参数对象进行匹配。它与名字相匹配。如果您需要更多信息,您可以搜索ModelBinder和ValueProviders。 – nemesv 2012-07-17 13:42:50
谢谢。会做。似乎不寻常的是它与实际的参数名称相匹配,而不仅仅是签名,这种类型打败了模板的目的! – 2012-07-17 13:43:39