为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"作为输入?

为MVC .net core创建自定义路由映射

我觉得你把路由混在一起了,你不应该像它将要使用的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 }
      );

    }
}

我已经测试过了,如果我理解你的问题,我就做你想做的。