gpt4 book ai didi

c# - 如何使用不同的参数在同一 Controller 中调用不同的 GET 方法?

转载 作者:太空狗 更新时间:2023-10-30 01:05:58 28 4
gpt4 key购买 nike

我有一个包含两种不同 Get 方法的 Controller 。一个采用 int 值,而另一个采用 String 值,如下所示:

public class AccountController : ApiController
{
public String GetInfoByString(String sUserInput)
{
return "GetInfoByString received: " + sUserInput;
}

public String GetInfoByInt(int iUserInput)
{
return "GetInfoByInt received: " + iUserInput;
}
}

我的RouteConfig.cs没有动过,如下:

public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

我的WebApiConfig.cs也没有动过,如下:

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

我希望能够通过使用单个链接访问 Web API,例如:

// Hit GetInfoByInt
http://localhost:XXXX/api/account/1

// Hit GetInfoByString
http://localhost:XXXX/api/account/abc

我可以很好地命中第一种情况,但每当我尝试命中第二种情况时,我都会收到以下错误:

<Error>
<Message>The request is invalid.</Message>
<MessageDetail>
The parameters dictionary contains a null entry for parameter 'id' of
non-nullable type 'System.Int64' for method 'TestProject.String GetInfoByInt(Int64)' in 'TestProject.Controllers.AccountController'.
An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</MessageDetail>
</Error>

是否有任何方法可以根据用户提供的是 String 还是 int 来选择 Get 方法?我假设需要在 RouteConfig 或 WebApiConfig 中进行更改,但我不太确定如何处理此问题。也许这毕竟只是一个简单的解决方案?

此外,如果重要的话,我希望能够使用包含字母和数字的 String 访问 GetInfoByString,例如 'ABC123' '123ABC'。 GetInfoByInt 可以类似于 '123'

如果可能的话,我真的很想坚持使用一个 Controller ,而不是将其分成多个 Controller 。

在此先感谢您的帮助。

最佳答案

如果您想将这两个操作分开,这是一种做事的方法:

config.Routes.MapHttpRoute("GetAccountInfoByInt", "api/account/{iUserInput}", new { controller = "account", action = "GetInfoByInt" }, new { iUserInput = @"\d+" });
config.Routes.MapHttpRoute("GetAccountInfoByString", "api/account/{sUserInput}", new { controller = "account", action = "GetInfoByString" });

请注意,我们计划在未来通过在下一版本的 Web API 中引入属性路由来简化此类操作:

https://aspnetwebstack.codeplex.com/wikipage?title=Attribute%20routing%20in%20Web%20API

如果您愿意使用我们的夜间构建,它应该已经可用。然后你所要做的就是添加几个属性:

[HttpGet("api/account/{sUserInput}")]
public String GetInfoByString(String sUserInput)

[HttpGet("api/account/{iUserInput:int}")]
public String GetInfoByInt(int iUserInput)

关于c# - 如何使用不同的参数在同一 Controller 中调用不同的 GET 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16968628/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com