【问题标题】:ASP.NET MVC Removed Controller QueryString ActionASP.NET MVC 删除了控制器 QueryString 操作
【发布时间】:2018-06-08 17:29:05
【问题描述】:

当我使用默认路由时:

routes.MapRoute(
"Default", // 
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional } );

应用程序找到以下方法:

public ActionResult News(DateTime? FromDate, DateTime? ToDate)
{
    IList<Model.MonthGroupNewsEntry> monthGroupNewsEntries = new services.NewsEntryService(new Data.SqlNewsEntryRepository()).GetMonthGroupNewsEntries();
    IList<Model.NewsEntry> newsEntries = new Services.NewsEntryService(new Data.SqlNewsEntryRepository()).GetNewsEntriesWithinDateRange(FromDate, 
    return View(new Models.NewsViewModel(monthGroupNewsEntries, newsEntries));
}

发件人:

<%= Html.ActionLink(b.MonthName + " " + b.Year.ToString() +  " (" + b.EntryCount.ToString() + ")", "News", new { FromDate = b.FromDate, ToDate = b.ToDate}) %>

但是当我尝试使用以下方法从 url 中删除控制器时:

routes.MapRoute(
"Default",
"{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional } );

我收到 404 资源未找到错误。

注意 : 类中的其他方法工作正常,但这些方法要么没有参数,要么没有“id”,只是用两个 DateTime 调用的方法?当我从 URL 中删除控制器时失败的参数。

感谢更新的答案,但是 - 我所做的唯一更改是从上面的“routes.MapRoute”中删除“{controller}/”文本 - 没有任何拼写错误等的机会,这个也在使用 MVC 3。

进一步:使用 Charx 的建议:

routes.MapRoute(
"SpecificAction",
"{action}/{FromDate}/{ToDate}",
new { controller = "ControllerName", id = UrlParameter.Optional } );

我不再收到 404 错误,但由于日期中的“/”,它给出了“400 - 错误请求”,因此我将日期重新格式化为 dd-MM-YYYY:

<%= Html.ActionLink(b.MonthName + " " + b.Year.ToString() +  " (" + b.EntryCount.ToString() + ")", "News", new { FromDate = b.FromDate.ToString("dd-MM-yyyy"), ToDate = b.ToDate.ToString("dd-MM-yyyy")}) %>

它不再是 404,FromDate 被识别得很好,但 ToDate 以空值出现。

Final :我将两个日期的类型更改为字符串,并在方法中将它们转换为 datetime - 现在两个参数都很好 - 我猜它可能是在寻找第一个参数,因此忽略了第二个。

现在唯一突出的是,需要“id”参数的方法现在似乎将其用作查询字符串 (NewsEnrty?ID=5),而不是“NewsEntry/5”,如果有人可以回答这个问题,那么谢谢 - 否则问题已回答- 再次感谢 Chanx。

【问题讨论】:

  • 为什么要从映射的路线中删除 {controller}?您是否只想创建一个两级深度 URL?
  • 该站点非常简单 - 在 url 中包含控制器似乎太过分了,因为永远只有一个控制器 - 它不仅可以从 url 中删除,还可以用于路由以确定必要的类?
  • 看看我的回答,让我知道这是否适合你。

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


【解决方案1】:

已编辑。如果您希望仍然能够识别要在 URL 中调用的操作,则必须指定您的特定操作路由并确保识别操作所在的正确控制器:

routes.MapRoute(
"SpecificAction",
"{action}/{FromDate}/{ToDate}",
new { controller = "ControllerName", id = UrlParameter.Optional } );

routes.MapRoute(
"Default", // 
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional } );

【讨论】:

  • 谢谢,但是 WhatIWantURLDirToBe 是“什么都没有”,我不想要 URL 目录,但是我想要一个上面似乎缺少的操作。当我尝试您的解决方案时,我会立即在索引页面上收到 404。
  • 也许我没有很好地解释自己,只有 {action}/{id} 的路由非常适用于 Index 和任何带有“id”参数的方法 - 当它导致 404该方法有两个DateTime?参数 - 方法之间的唯一不同是 DateTime?参数方法导致查询字符串类型“?from=xxxxx&to=xxxxx”,而不是标准的“/xxxxx”类型mvc url。当我删除“{controller}/”时,所有方法都可以完美地与“{controller}/{action}/{id}”一起使用,只有带有 DateTime 的方法?参数失败。
  • 对。缺少解释部分。编辑后的答案,我希望它越来越接近您的需要。
  • 几乎 - 但我知道你现在要去哪里 - 日期中的 '/' 会导致 400“错误请求” - 也许我应该将日期重新格式化为 YYYYMMDD 以便调用摆脱'/' 那么你的解决方案应该可以工作。
  • @user1907097 使用{action}/{id} 添加新的映射路由。请务必将其命名为"SpecificAction" 以外的其他名称并识别控制器,您应该会很好。
【解决方案2】:

好的,当您编辑问题时,我会得到您想要的初始答案。我还创建了简单的解决方案来测试您的问题,它也适用于新闻控制器操作。日期不可能影响路由。但是你需要先检查一下——也许你犯了一些错误。再次检查路由,检查控制器名称,重新输入,检查正确的操作放置在 prpper 控制器上。如果您仍然遇到问题,请为您的问题创建一个小项目并将其放在保管箱或其他我可以获取和测试的地方,因为现在我无法重现您的问题。另外,我正在使用 MVC 3。

【讨论】:

  • 为什么不使用MapRoute最后一个参数中指定的控制器,即HomeController?
  • 该站点非常简单 - 在 url 中包含控制器似乎太过分了,因为永远只有一个控制器 - 它不仅可以从 url 中删除,还可以用于路由以确定必要的类? 上面编辑的问题...
猜你喜欢
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多