自从我在MVC中完成了一些控制器代码以来已经有一段时间了。但是,控制器中是否可能存在相同方法名称的重载,例如:
(这是伪代码,它并不完美)
[HTTPGET] 得到()
[HTTPGET] 获取(int id)
我觉得你可以吗?你用路线模式区分了吗?只是重新检查,我正在与WCF合作,我只是想知道我是否可以在MVC中做到这一点,我想我可以在过去,只是不记得了。当你有两个带有方法名称的重载时WCF婊子使用WebGet获取并且它会让我感到害怕......我不喜欢这样。
答案 0 :(得分:1)
es你可以有重载但是每个额外的重载必须用[ActionName]
属性标记。否则控制器会混淆并在运行时抛出AmbiguousMatchException
,但重载将编译。
以下是添加了默认家庭控制器的重载示例:
public class HomeController : Controller
{
// Default Action method.
// Url: /Home
public ActionResult Index()
{
ViewBag.Message = "jump-start your ASP.NET MVC application.";
return View();
}
// Url: /Home/About
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
// Url: /Home/AboutByInt/3
[ActionName("AboutByInt")]
public ActionResult About(int id)
{
ViewBag.Message = "Your app description page. The Id is: " + id;
return View();
}
}
另一种方法是使用可以提供或不提供给Action方法的可空参数:
// Url: /Home/Contact
public ActionResult Contact(int? id)
{
if (id == null)
{
// Page was accessed by url: /Home/Contact
ViewBag.Message = "id is null";
}
else
{
// Page was accessed by url: /Home/Contact/[int]
ViewBag.Message = "id is : " + id;
}
return View();
}
答案 1 :(得分:0)
使用属性路由。
将此添加到您的WebApiConfig文件中:
config.MapHttpAttributeRoutes();
然后,您可以使用属性指定路线和所需参数。
[HttpGet]
[Route("/api/mycontroller")]
public IHttpActionResult Get()
{
var myQuery = {your query};
return Ok(myQuery);
}
[HttpGet]
[Route("/api/mycontroller/{id:int}")]
public IHttpActionResult Get(int id)
{
var myQuery = {your query};
return Ok(myQuery);
}
您可以通过在控制器上放置RoutePrefix来缩短路线属性。
[RoutePrefix("api/mycontroller")]
public class MyControllerController : WebApiController
{
...
}
然后你可以在行动路线上删除那部分。
[HttpGet]
[Route("")]
public IHttpActionResult Get()
{
...
}
[HttpGet]
[Route("{id:int}")]
public IHttpActionResult Get(int id)
{
...
}
此外,您无需在路由参数中指定数据类型:
[Route("{id}")]
我喜欢强烈打字的东西。