ASP.. NET MVC WebApi路由的子url
本文关键字:url 路由 WebApi NET MVC ASP | 更新日期: 2023-09-27 18:01:57
关于这个话题有很多问题,但我很难找到解决我的问题的方法。
同样Stackoverflow,我想得到问题(主)和答复(细节)层次json与以下四种情况。
- /api/question/:问题列表
- /api/question/{id}: id的问题
- /api/question/{id}/reply/: 对的回答列表。
- /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"
,但它似乎不是一个好的解决方案。
我怎样才能做到呢?
我想知道为什么单个控制器应该在它的所有方法?
为了更易于管理,总是建议使用多个控制器。
我的建议是
- 创建一个名为Reply的新控制器
- 回复总是期望参数,即QuestionId
- 如果需要特定的回复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/是一个不错的选择。