使 ASP.Net 中的 URL 易于使用

Posted

技术标签:

【中文标题】使 ASP.Net 中的 URL 易于使用【英文标题】:Make URL in ASP.Net user-friendly 【发布时间】:2011-01-01 12:13:12 【问题描述】:

我正在尝试使用 Web 表单在 ASP.Net 中开发我的第一个网站。

我有一个带有一些控件和一个 TextBox 控件的表单。而现在我使用GETrequest。当用户提交表单时,他的浏览器期望获得长 URL,例如

http://mysite.com/search.aspx?__VIEWSTATE=%2FwEPDwUJNTE2NjY5jMY4D2QWAgICD2QWAgIDDW8wAh4EVGV4dAUBMWRkZKthQ0zeIP5by49qIHwSuW6nOj8iLTdoCUzpH369xyg8&__EVENTVALIDATION=%2FwEWAwLnrcHhBQLs0bLrBgKM54rGBjGtX5fJOylLy4qRbt6DqPxO%2FnfcMOkHJBRFqZTZdsBD&TextBox1=sfs&Button1=Button

如果他的输入是TextBox1 中的单词sfs。 所以我需要回复他。我想在用户友好的 URL 上显示此响应,例如

http://mysite.com/search.aspx?TextBox1=sfs

http://mysite.com/sfs

http://mysite.com/search/sfs

我该怎么做?如果我使用 Response.Redirect,它首先返回 302,然后才可以处理短 URL。 Server.Transfer 不会更改 URL,用户会在浏览器中看到难看的长 URL。

在我看来,可以通过 4.0 框架中出现的RouteCollection.MapPageRoute 解决,但我不清楚如何使用它。

感谢任何帮助。

更新。使用POST 代替GET 不是问题。但这样一来,URL 将始终看起来像 http://mysite.com/search.aspx

更新2。表单必须是服务器控件,并且除了提交和文本框之外,它还有其他控件。这会很好(不过,如果此参数没有出现在浏览器中显示的 URL 中,则仍然没有必要。

【问题讨论】:

【参考方案1】:

不幸的是,对 ASP.NET 服务器表单使用 GET 请求总是会产生那些“丑陋”的 URL。

您可以做的一件事是将表单更改为不是服务器表单而是常规表单:

<form method="get" action="Search.aspx">
    <input type="text" name="query" />
    <input type="submit" name="SearchButton" value="Search" />
</form>

此解决方案的一个限制是您不能再将某些 ASP.NET 控件放置在此表单中。例如,&lt;asp:Button&gt; 控件在此表单中不起作用,因为它必须包含在服务器表单中(即,上面有 runat="server" 的表单)。

【讨论】:

【参考方案2】:

因为它是一个 GET 请求,你也可以使用 javascript,设置

location.href = 'http://mysite.com/search/' + query; 

然后在 ASP.NET 端,您可以使用 URL Rewriting 功能将该 url 作为查询字符串参数重定向到特定的 ASPX 页面。

如果您需要更详细的示例,请告诉我。

示例:

这是一个示例,请注意我尚未对其进行测试,但这应该可以帮助您入门。

<html>
<head>
  <script type="text/javascript">
    function searchRedirect()
    
      var query = $get('query');
      location.href = "/search/" + query.value;
    
  </script>
</head>
<body>
    <div class="search">
        <input type="text" id="query" /><br />
        <input type="button" id="search" value="Search" onclick="searchRedirect();" />
    </div>
</body>
</html>

然后在重定向端你有一个这样的 RouteModule:

public class UrlRewriter : IHttpModule

    public void Dispose()
    
    

    public void Init(HttpApplication context)
    
        context.AuthorizeRequest += new EventHandler(OnBeginRequest); //this ensures the login page has the vitual url not the mapped url
    


    private void OnBeginRequest(object sender, EventArgs e)
    
        var application = sender as HttpApplication;
        if (application != null)
        
            var requestPath = application.Request.AppRelativeCurrentExecutionFilePath;
            if (requestPath.ToLower().StartsWith("/search/"))
            
                var query = requestPath.Substring(8);
                application.Context.RewritePath("Search.aspx", null, "query=" + query, false);
            
            // .. Other Routes
        
    

假设代码在您的 App_Code 文件夹中,您可以在 web.config 中使用它

<system.web>
  <!-- ... -->
  <httpModules>
      <add name="UrlRewriter" type="UrlRewriter, __code"/>
  </httpModules>
</system.web>

<!-- If IIS7 -->
<system.webServer>
  <modules>
    <add name="UrlRewriter" type="UrlRewriter, __code" />
  </modules>
</system.webServer>

【讨论】:

是的,我对您的解决方案很感兴趣。能否提供更详细的样本? 这个解决方案当然取决于启用 JavaScript 的用户。您是否需要此应用在所有浏览器(包括手机)以及使用屏幕阅读器等辅助功能的用户上运行? 我假设 JS 已启用,因为它还会使用 AJAX 首先我的目标是桌面浏览器 - IE、Firefox、Safari、Opera @flashnik,你用什么做你的 AJAX? jQuery? ASP.NET AJAX? 是的,我看过并支持。我正在检查我的一个想法。非常感谢您的解决方案!它做我想要的。使用此类代码可能会遇到哪些限制?我的意思是为什么有人问我有关浏览器和手机的问题?【参考方案3】:

嗯,导致“看起来很糟糕”的主要原因是您使用的是 ViewSate 和 GET;所以不要这样做(要么禁用 ViewSate 并相应地调整代码,要么使用 POST)。

不过,您可能还感兴趣的是 URL 重写。您可以通过几种方式做到这一点,我通常使用 IIS 中的通配符映射和对 Global.asax 文件的适当更改来做到这一点。搜索将揭示如何做到这一点。

【讨论】:

即使您禁用 ViewState,仍然至少会有一个小的 __VIEWSTATE 字段(可能还有其他字段)。我想问题是关于如何使 URL 完全“漂亮”还是“不那么丑”:) 我更新了我的问题。我可以使用POST,但在这种情况下,它会保持不变,而且不会像我想要的那么多——我想为 TextBox 中输入的每个单词设置单独的 URL。像 Google 所做的那样 - 对于每个搜索请求,它都有自己的 url 并在没有临时重定向的情况下提供它。 好吧,在这种情况下,您需要重写 URL。四处寻找它;你会很容易找到一些关于它的教程。 它将如何工作?我的意思是如何在没有重定向的浏览器中形成漂亮的 URL? AFAIK 重写将使创建漂亮的长 URL 但如何设置这个聪明?

以上是关于使 ASP.Net 中的 URL 易于使用的主要内容,如果未能解决你的问题,请参考以下文章

重定向到 ASP.net 核心中的 url

如何使 Asp.NET Core MVC 应用程序在授权重定向上使用外部 url?

ASP.Net URL 编码

ASP.NET 使用 System.Web.Script.Serialization 解析 JSON (转)

ASP.NET 回发会丢失 URL 中的哈希值

ASP.NET MVC 中的动态路由操作名称