MVC4 Web API忽略参数
尝试在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}
,但在您的行动中,您有value
,MVC与名称匹配的是“事物”(路线值,查询字符串值等)。
所以名称应该一致:
因此改变你的路由:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{value}",
defaults: new {
value= RouteParameter.Optional
}
);
它将与URL工作:http://localhost:1505/api/test/double/4
注意:如果你离开value
RouteParameter.Optional
你需要将您的动作签名中的类型更改为int?
。
或者你可以改变你的操作方法的签名:
[HttpGet]
public int Double(int id)
{
return id * 2;
}
或者你可以离开它,因为它只是使用这个网址:
http://localhost:1505/api/test/double?value=4
这种情况发生,我当我有没有定义属性[RoutePrefix(“”)]和[Route(“”)]为我的控制器和操作方法在web api.Its完美适用于我后添加这些。
所以基本上,方法中的参数名称必须与模板中使用的名称相匹配?这是否意味着我必须为每种可能的方法创建一个路径,即使它匹配现有的模式(或者使用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