[英]ASP.NET MVC WebApi Route for sub url
這個主題有很多問題,但是我很難解決我的問題。
同樣的Stackoverflow,我想在以下四種情況下獲得問題(主)和答復(詳細)分層json。
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可以工作,但這似乎不是一個好的解決方案。
我該怎么做?
我想知道為什么單個控制器中應該包含所有方法?
為了使其更易於管理,始終建議使用多個控制器。
我可以建議的是
一條路線可以是
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.