ASP.. NET MVC WebApi路由的子url

本文关键字:url 路由 WebApi NET MVC ASP | 更新日期: 2023-09-27 18:01:57

关于这个话题有很多问题,但我很难找到解决我的问题的方法。

同样Stackoverflow,我想得到问题(主)和答复(细节)层次json与以下四种情况。

  1. /api/question/:问题列表
  2. /api/question/{id}: id的问题
  3. /api/question/{id}/reply/: 的回答列表。
  4. /api/question/{id}/reply/{rid}:问题的一个回复项。

前两个url不是WebApi CRUD为我生成的问题。但以下两个网址,我无法做到。

以下方法为QuestionController中的相关方法(注意控制器名称为Question)

// case 1.
public virtual Question Get(){
    // return list of questions
}
// case 2.
public virtual Question Get(Int64 id)
{
    // return question item.
        var item = ((IQuestionRepository)repository).GetFirstFiltered(n => n.Id == id);
        return item;
}
// case 3.
public virtual Question GetReply(Int64 id)
{
    // return a list of replies         
}
// case 4.
public virtual Question GetReply(Int64 id, Int64 rid)
{
    // return reply item of rid.
}

第一次尝试
我在默认路由上面添加了如下的路由,但是只有第四种方法被触发。

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

第二次尝试
我在WebApi2中创建了新引入的Route属性。在情形3和情形4中不命中。

    // case 3.
    [Route("reply")]
    public virtual Question GetReply(Int64 id)
    {
        // return list of reply
    }
    // case 4.
    [Route("reply/{rid}")]
    public virtual Question Get(Int64 id, Int64 rid)
    {
        // return reply item
    }

路由工作,如果我从第一个地址设置为"~api/{controller}/{id}/reply",但它似乎不是一个好的解决方案。

我怎样才能做到呢?

ASP.. NET MVC WebApi路由的子url

我想知道为什么单个控制器应该在它的所有方法?

为了更易于管理,总是建议使用多个控制器。

我的建议是

  1. 创建一个名为Reply的新控制器
  2. 回复总是期望参数,即QuestionId
  3. 如果需要特定的回复Id,则/QuestionId/ReplyId

路由可以是

config.Routes.MapHttpRoute(
            name: "ReplyApi",
            routeTemplate: "api/{controller}/{id}/{rid}",
            defaults: new
            {
                controller = "Reply",
            }
更新:

试试http://mvccoderouting.codeplex.com/它在Routing

上提供了更大的灵活性

对于你的Method你可以尝试

public ActionResult Reply(int Questionid, int? ReplyId) {
   if (ReplyId.HasValue) {
      // ReplyId present
   } else {
      // ReplyId not present
   }
}

为了在没有@Nipun介绍的http://mvccoderouting.codeplex.com/帮助的情况下解决我的问题,我在控制器类中添加了RoutePrefix,在每个方法中添加了Route属性。有点脏,但如果你的控制器没有很多动作,可以方便地使用它。

否则,http://mvccoderouting.codeplex.com/是一个不错的选择。