【问题标题】:ASP.NET MVC Remove query string in action methodASP.NET MVC 在操作方法中删除查询字符串
【发布时间】:2012-03-29 04:38:27
【问题描述】:

我有一个如下所示的操作方法:

public ActionResult Index(string message)
{
  if (message != null)
  {
    ViewBag.Message = message;
  }
  return View();
}

发生的情况是,对此的请求的 url 将如下所示:

www.mysite.com/controller/?message=Hello%20world

但我希望它看起来只是

www.mysite.com/controller/

有没有办法删除 actionmethod 中的查询字符串?

【问题讨论】:

  • 您是说当他们不输入查询字符串时您想要默认消息?或者您想隐藏查询字符串,而不管最初在 url 上发送的消息类型如何?
  • 第二个,基本上我想处理消息(可以是任何东西),而不是在url上显示。

标签: asp.net asp.net-mvc routing query-string


【解决方案1】:

您可以通过在 razor 视图中添加一些 JavaScript 来删除查询字符串。

@section scripts{
    <script>
        if (location.href.includes('?')) { 
            history.pushState({}, null, location.href.split('?')[0]); 
        }
    </script>    
}

如果你导航到页面

www.mysite.com/controller/?message=Hello%20world

然后它会显示

www.mysite.com/controller/

在浏览器中。

大多数现代浏览器都支持此功能 (browser support)。

【讨论】:

  • 不了解 OP,但这正是我所需要的。谢谢!
【解决方案2】:

我建议使用蛞蝓。看看这篇文章:SOF Slug post 在以前的应用程序中,我采用这种方法从 URL 中删除查询字符串。

【讨论】:

    【解决方案3】:

    不,除非您使用 POST 方法,否则信息必须以某种方式传递。另一种方法可能是使用中间类。

    // this would work if you went to controller/SetMessage?message=hello%20world
    
    public ActionResult SetMessage(string message)
    {
      ViewBag.Message = message ?? "";
      return RedirectToAction("Index");
    }
    
    public ActionResult Index()
    {
      ViewBag.Message = TempData["message"] != null ? TempData["message"] : "";
      return View();
    }
    

    或者。如果您只是使用 POST

    //your view:
    @using(Html.BeginForm())
    {
        @Html.TextBox("message")
        <input type="submit" value="submit" />
    }
    
    
    [HttpGet]
    public ActionResult Index()
    { return View(); }
    
    [HttpPost]
    public ActionResult Index(FormCollection form)
    {
      ViewBag.Message = form["message"];
      return View();
    }
    

    【讨论】:

    • 是的,正如我所想。我最终做了类似的事情: if (message != null) { TempData["Message"] = message; return RedirectToAction("索引"); } if (TempData.ContainsKey("Message")) { ViewBag.Message = TempData["Message"]; TempData.Remove("消息"); },它基本上保存了消息,然后重新加载相同的不带参数的 actionmethod。
    • 这仍然是最好的解决方案吗?我有一个页面只在特定时间显示,它需要一个模型,但是这个动作不能公开访问,我希望它有一个漂亮的 URL,比如 /Registration/AfterHours 而不是 /Registration/AfterHours?DateTime...[疯狂的字符]。无论如何,这确实有效。
    【解决方案4】:

    查看routes。它们定义了如何编写带有参数的 url。

    如果您创建一个新的 MVC 应用程序,并查看 `RegisterRoutes() 下的 Global.asax.cs 文件。你应该看到一个条目。

    routes.MapRoute(
       "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "home", action = "index", id = UrlParameter.Optional } // Parameter defaults
            );
    

    看看每个部分:

    • “默认”是名称。这对于您创建的每条路线都必须是唯一的。
    • “{controller}/{action}/{id}”是您要使用的模式。 example.org/home/index?id=2 将改为 example.org/home/index/2
    • new { controller = "home", action = "index", id = UrlParameter.Optional } 如果未指定任何内容,则定义默认值。

    因此,如果您访问 example.org,那么这条路线将假定您的意思是 example.org/home/index{id 是可选的}

    从此开始,您可以开始了解如何创建自己的路线。

    现在,回答您的问题,简短的回答是,您可以使 URL 看起来像那样,但 不是真的。您必须使用默认消息定义路由,并且如果有人没有指定消息,它只会看起来像这样。您必须告诉控制器消息是什么。很抱歉,但您能做的最好的事情就是定义一条可以为您提供的路线

    /message/Hello%20World 并使用 string.replace 使这看起来更好 `'/message/hello_world'

    【讨论】:

    • 他不是想添加一个友好的参数,他想以某种方式有一个查询字符串值,但根本不在url中显示它。
    【解决方案5】:

    我不确定你是否真的考虑清楚了。如果您删除查询字符串...然后您删除查询字符串.. 即,您的页面将没有查询字符串值来执行它需要执行的任何操作。

    你可以做很多不同的黑客攻击......所有这些都不理想。您可以使用 javascript 去除查询字符串。设置会话变量后,您可以重定向到无查询字符串的页面。这一切都很丑陋。

    请记住,用户在地址栏中看到的是客户端。客户端控制它。您可以通过 javascript 来摆弄它,但这样做通常是个坏主意。由于向用户隐藏内容可能被视为类似恶意软件的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2018-02-18
      • 2012-01-05
      相关资源
      最近更新 更多