为MVC .net core创建自定义路由映射
本文关键字:自定义 路由 映射 创建 core MVC net | 更新日期: 2023-09-27 18:11:34
我有一个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结束时,应该重定向到Edit(string postName)
,当路由以author结束时,它应该重定向到ReadAuthor(string postName)
我应该如何编写控制器和路由映射,以便正确的路由连接到正确的动作,并给方法的"post name"作为输入?
我觉得你把路由混在一起了,你不应该像它将要使用的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最佳实践,希望对您有所帮助。
编辑:我只是想澄清一下,我不喜欢我在这里所做的,在我看来,这是各种各样的这里是控制器代码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 }
);
}
}
我已经测试过了,如果我理解你的问题,我就做你想做的。