我有一个Post Controller应该处理这样的路线:
mywebsite.com/post/somthing
mywebsite.com/post/post1
mywebsite.com/post/anotherpost
...
当我在网上搜索我的答案时,我发现如何注册我的地图路线:
routes.MapRoute(
name: "post",
template: "post/{*postname}",
defaults: new { controller = "Post", action = "ReadPost" });
但我不知道当我为我的路线创建一个控制器和动作方法时如何将{* article}作为我的方法的输入,以便该方法知道返回视图的模型。
我的控制器也必须处理以下路线:
mywebsite.com/post/anotherpost/comments
mywebsite.com/post/anotherpost/edit
mywebsite.com/post/anotherpost/author
当路线没有任何结束时,应将其重定向到ReadPost(string postName)
当路线以评论结束时,应将其重定向到ReadComment(string postName)
当路线以编辑结束时,应将其重定向到Edit(string postName)
当路线以作者结束时,应将其重定向到ReadAuthor(string postName)
我应该如何编写控制器和路由映射,以便正确的路由连接到正确的操作并为方法提供“帖子名称”作为输入?
答案 0 :(得分:1)
我认为你把路线混合了一下,你不应该把你的控制器命名为它要使用的HTTP动词,反过来说,你应该使用 http://www.domain.com/article并在控制器中创建操作以匹配 像这样的HTTP动词(我使用web api因为我已经打开了一个项目):
public class ArticleController : ApiController
{
// GET: api/Default
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET: api/Default/5
public string Get(int id)
{
return "value";
}
// POST: api/Default
public void Post([FromBody]string value)
{
}
// PUT: api/Default/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE: api/Default/5
public void Delete(int id)
{
}
}
然后你可以在apiconfig.cs中使用路由
像这样: config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这里有一些REST best practice希望这会有所帮助。
编辑:
只是为了澄清我不喜欢我在这里所做的和我的观点各种各样 错误但是为了帮助你开始这里是控制器代码:
public class PostController : Controller
{
public ActionResult ReadPost(string postName)
{
return View("~/views/home/Index.cshtml");
}
public ActionResult Comments(string postName)
{
ViewBag.Message = "Your application description page.";
return View("~/views/home/Index.cshtml");
}
public ActionResult Edit(string postName)
{
ViewBag.Message = "Your contact page.";
return View("~/views/home/Index.cshtml");
}
public ActionResult Author(string postName)
{
ViewBag.Message = "Your contact page.";
return View("~/views/home/Index.cshtml");
}
}
这是路径文件:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//routes.MapRoute(
// name: "Default",
// url: "{controller}/{action}/{id}",
// defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
//);
routes.MapRoute(
name: "postOnlyParam",
url: "post/{postName}",
defaults: new { controller = "Post", action = "ReadPost", postName = UrlParameter.Optional }
);
routes.MapRoute(
name: "post",
url: "post/{action}/{postName}",
defaults: new { controller = "Post", action = "ReadPost", postName = UrlParameter.Optional }
);
}
}
如果我理解你的问题,我已经对它进行了测试并做了你想做的事。