簡體   English   中英

子URL的ASP.NET MVC WebApi路由

[英]ASP.NET MVC WebApi Route for sub url

這個主題有很多問題,但是我很難解決我的問題。

同樣的Stackoverflow,我想在以下四種情況下獲得問題(主)和答復(詳細)分層json。

  1. / api / question /:問題列表
  2. / api / question / {id}:ID問題
  3. / api / question / {id} / reply /:對問題的答復列表。
  4. / api / question / {id} / reply / {rid}:問題的一個答復項。

WebApi CRUD為我生成了前兩個URL並不是問題。 但是在兩個網址以下,我無法實現。

以下方法與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" ,則Route可以工作,但這似乎不是一個好的解決方案。

我該怎么做?

我想知道為什么單個控制器中應該包含所有方法?

為了使其更易於管理,始終建議使用多個控制器。

我可以建議的是

  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/,它為路由提供了更大的靈活性

而對於您的方法,您可以嘗試

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/是一個很好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM