使 ASP.Net 中的 URL 易于使用
Posted
技术标签:
【中文标题】使 ASP.Net 中的 URL 易于使用【英文标题】:Make URL in ASP.Net user-friendly 【发布时间】:2011-01-01 12:13:12 【问题描述】:我正在尝试使用 Web 表单在 ASP.Net 中开发我的第一个网站。
我有一个带有一些控件和一个 TextBox 控件的表单。而现在我使用GET
request。当用户提交表单时,他的浏览器期望获得长 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 控件放置在此表单中。例如,<asp:Button>
控件在此表单中不起作用,因为它必须包含在服务器表单中(即,上面有 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 Core MVC 应用程序在授权重定向上使用外部 url?