2相同方法Controller中的名称使用Web API连接到路由

时间:2014-08-10 20:52:04

标签: asp.net-mvc asp.net-web-api2

自从我在MVC中完成了一些控制器代码以来已经有一段时间了。但是,控制器中是否可能存在相同方法名称的重载,例如:

(这是伪代码,它并不完美)

[HTTPGET] 得到()

[HTTPGET] 获取(int id)

我觉得你可以吗?你用路线模式区分了吗?只是重新检查,我正在与WCF合作,我只是想知道我是否可以在MVC中做到这一点,我想我可以在过去,只是不记得了。当你有两个带有方法名称的重载时WCF婊子使用WebGet获取并且它会让我感到害怕......我不喜欢这样。

2 个答案:

答案 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}")]

我喜欢强烈打字的东西。