【问题标题】:How can I remove (or hide) the querystring after a View loads?加载视图后如何删除(或隐藏)查询字符串?
【发布时间】: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):

http://localhost:64400/StudentRosters/FilterableIndex

可以通过让 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


【解决方案1】:

您可以改为添加到 ViewBag。或者创建一个模型,您可以在视图中检索并使用@Html.HiddenFor 将其发送回服务器。

【讨论】:

    【解决方案2】:

    要添加到@StevenMueke,我从 W3C (URIs, Addressability, and the use of HTTP GET and POST) 找到了这份文档。

    总之,它说明了仅在查询时POST有适当的用途:保存敏感信息,以防查询字符串太大,以及其他原因。

    在我的情况下使用[HttpPost] 以便我可以从地址栏中隐藏查询字符串不会违反任何编码规则。

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2019-05-29
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多