【问题标题】:Routing in ASP.Net core 2 MVCASP.Net core 2 MVC 中的路由
【发布时间】:2019-07-03 12:02:16
【问题描述】:

我现在已经使用 MVC 工作了大约 1 年,但还没有真正需要深入研究路由,只是使用了正常的默认值。在一个新的应用程序中,我现在需要调整这些并且无法弄清楚它是如何工作的。

我的情况 我有一个应用程序,它从一个视图开始,其中包含数据库中不同日历的列表。 这些日历中的每一个都应该有一个指向它们的 url,如下所示:

home/calendarName/weekNumber

--> 基于日历名称的控制器/动态字符串/基于所选周的动态int

问题是我不想为每个 CalendarName--> 日历创建一个操作。

我的问题可以理解吗?

这是我的 Startup.cs 代码 atm:

app.UseMvc(routes =>
            {
                routes.MapRoute(
                  name: "test",
                  template: "test",
                  defaults: new { controller = "Home", action = "Name-Of-Calender", id="WeekID_Of_Calendar" });


                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=KalenderListe}/{id?}");
            });

这是 View atm 中的 URL-Action。

"@Url.Action("View", "Home", new {KalenderName= kalender.KalenderName,Id= kalender.KalenderId})"

如果不清楚我想做什么,请告诉我,我会调整它。提前致谢。

【问题讨论】:

    标签: c#


    【解决方案1】:

    对于您的问题,您可以在操作方法上使用属性路由。只需在您的路线中写入字符串,如下所示

    `

    [Route("Home/About")]
       public IActionResult MyAbout()
       {
          return View("About");
       }
       [Route("Home/Contact")]
       public IActionResult MyContact()
       {
          return View("Contact");
       }
    

    `

    你也可以随意改变

    `

    [Route("About/Home")]
       public IActionResult MyAbout()
       {
          return View("About");
       }
    

    `

    【讨论】:

    • 不幸的是,这对我不起作用。我有传递给操作的参数,它会在我在顶部输入的 Route 之后将它们写入 URL。
    • 还有一个问题,URL 中的名称与每种类型的 kalender 不同。如前所述,我希望它能够动态改变。
    【解决方案2】:

    您可以在家庭控制器中对您的操作使用属性路由。

    [HttpGet("{calendarName}/{id}")]
    public void ActionResult GetCalendar(string calendarName, int id)
    {
        ...
    }
    

    或者如果你想作为可选查询传递

    [HttpGet("{calendarName}")]
    public void ActionResult GetCalendar(string calendarName, [FromQuery]int id)
    {
        ...
    }
    

    【讨论】:

    • 哦,完美的工作。不过有一个问题......如果我想在 httpget 中留下 id 并只显示日历名称,我怎么能留下 id 呢?当我刚刚尝试删除发生这种情况的星期数时 --> localhost:44306/KalenderTool?Id=1
    • 对不起。不知道我明白。你想让 id 是可选的吗?
    • nono 我只是问我如何才能完全保留 ID,但仍将其作为参数传递。所以我想把它藏起来
    • 如果您将路由更改为 {calendarName},但保留 id 作为参数,它应该绑定到查询参数 (?id=x)。您可以将[FromQuery] 放在前面,以确保它也只绑定到查询。或者,您可以将路线设置为{calenderName}/{id?},无论您是否通过id,您的操作都应该受到打击
    • FromQuery 就是我要找的东西。我必须把它放在哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多