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

时间:2016-10-05 14:29:08

标签: c# asp.net-mvc asp.net-core

我有一个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)

我应该如何编写控制器和路由映射,以便正确的路由连接到正确的操作并为方法提供“帖子名称”作为输入?

1 个答案:

答案 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 }
      );


    }
}

如果我理解你的问题,我已经对它进行了测试并做了你想做的事。