【问题标题】:Creating custom route mapping for MVC .net core为 MVC .net 核心创建自定义路由映射
【发布时间】:2016-10-05 14:29:07
【问题描述】:

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

当路由以 cmets 结尾时,它应该被重定向到 ReadComment(string postName)

当路径以编辑结束时,它应该被重定向到Edit(string postName)

当路由以作者结尾时,它应该被重定向到ReadAuthor(string postName)

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

【问题讨论】:

  • 您写道,“...如何将 {*article} 作为输入...” article 是什么?
  • is {antherpost} 在您的问题中是字符串 postName?
  • @ShaunLuttin 抱歉,我修正了一个错字
  • @Liran 是的,这是一个字符串名称。

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


【解决方案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 }
      );


    }
}

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

【讨论】:

  • 不是我想要的答案。您所指的代码段是来自此link 的代码段,我对其进行了略微修改以指出我打算如何修改代码的事实,并提到我放在那里的代码映射只能回答第一部分我的问题不是第二部分,我还是解决了文章名称问题。您放置的控制器和映射方法与 MVC 核心中的默认映射执行相同的工作。我这里不需要的
  • @soorena12 现在请检查答案。
猜你喜欢
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
相关资源
最近更新 更多