【发布时间】:2016-05-15 22:52:37
【问题描述】:
在 MVC 5 Web 应用程序中,我有一个带有 [HttpGet] 注释的 ActionResult。通过使用Html.BeginForm 和通过带有参数的Html.ActionLink 链接到该页面,该页面按预期工作。页面加载正确,参数读取正确,使用正确。
我想做的唯一调整是让查询字符串不显示在浏览器的 URL 地址栏中。我寻找了相关的 SO 问题,但我所看到的都是相反的情况。
这主要是出于美观和好奇。当提出问题时,“为什么要删除查询字符串?”我的回答是,“ActionResult 需要查询字符串才能正确处理,但用户不需要看到它,而且绝对不需要带有查询字符串的书签。”
在我的情况下,我的 URL 如下所示:
http://localhost:64400/StudentRosters/FilterableIndex?SelectedCampus=PRA&SelectedFiscalYear=FY12
我希望它看起来像这样(没有查询字符串的 URL):
我可以通过让 ActionResult 使用 [HttpPost]annotation 来使查询字符串消失,但我的印象是,只有在更改模型中的数据时才应该使用 POST(例如,创建或编辑),并且当您只查询数据时应该使用 GET(我在这种情况下)。
这个大约四年前的SO answer 说,如果没有某种中间方法,就不可能在 GET 方法中不显示查询字符串。从那以后有什么变化吗?
在有关 MVC 5 的 Microsoft Virtual Academy 视频中,我听到一位培训师提到 Route 可用于清理用户在浏览器中看到的 URL。他实际上并没有举出任何例子,所以我不知道我是否误解了他的说法。到目前为止,我还没有看到可以使用路由隐藏查询字符串的示例。
我正在发布我的路线,以防万一。
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 }
);
}
}
我得出的结论是,如果我想隐藏查询字符串,我需要使用[HttpPost] 注释,即使我只是查询而不更改数据。我遗漏了什么明显或简单的东西吗?
【问题讨论】:
-
是的,您需要使用
[HttpPost](如果您没有将值作为查询字符串或路由参数包含在 GET 方法中,那么您的方法将无法获取它们。 -
是的,我确实尝试过使用
[HttpPost]进行迭代。在我问这个问题之前阅读更多关于这个主题的内容,我读到 Post 应该只在你更改模型中的数据而不是查询时完成。我只是觉得这是对该属性的不当使用,即使它确实在浏览器中为我提供了 URL 而没有显示查询字符串。 -
重要的是,如果您使用
[HttpPost](而不是使用[HttpGet])更改数据,但您仍然可以使用[HttpPost]查询数据。 -
我会坚持下去,考虑到它确实有效而且我还没有遇到任何问题。而且,它只是一个地方的简单调整。
标签: c# asp.net-mvc