请求无效?

时间:2014-02-05 02:12:54

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

一点点asp.net mvc noob,我试图传入一个字符串作为我的Web API控制器的参数:

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    public string Get(string arg)
    {
        return "othervalue";
    }

}

我试图添加另一条路线:

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

所以我想保留两个Get方法并使用带有arg参数的Get,这样我就可以传入一个字符串。因此,当我尝试在浏览器中点击此URL“api / values / jjhjh”时,我收到此错误:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'stackOverflowWebApi.Controllers.ValuesController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

1 个答案:

答案 0 :(得分:1)

您添加的其他路由是MVC路由,而不是WebAPI路由。 WebAPI路由默认不在RouteConfig.cs中,它们位于WebApiConfig.cs中。他们看起来更像是这样:

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

您发布的错误来自于完全没有传递任何数据。试试这个:

public string Get(string id = null)
{
    return "othervalue";
}

请注意,参数名称为id,而不是arg,以使其与可选的路由参数匹配。此外,将其默认为null告诉绑定器在没有数据传递时可以调用此方法。