Перезапись URL-адреса заключается в перезаписи URL-адреса (пот ^_^).
Подробности: http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
Преимущества: сокращение URL-адреса и т. д.
Использование: 1. Загрузите URLRewrite.dll MS и поместите его в корзину
2. . Установите следующие настройки в web.config:
<?xml version="1.0"coding="utf-8" ?>
<configuration>
<configSections>
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
<RewriterConfig>
<Правила>
<RewriterRule>
<LookFor>~/d(d+).aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo>
</RewriterRule>
</Rules>
</RewriterConfig>
<system.web>
<httpHandlers>
<add verb="*" path="*.aspx"
type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
</httpHandlers>
Затем напишите в cs:
Private void Page_Load(отправитель объекта, System.EventArgs e)
{
//Поместите сюда пользовательский код для инициализации страницы
Response.Write(Request.QueryString["id"]+"<BR>");
Response.Write("ха-ха");
}
Просто введите
localhost/overred/d123.aspx (примечание: начало должно быть d, а затем цифра).
На самом деле этот файл d123.aspx является виртуальным и на самом деле не существует. Лишь бы формат соответствовал.
Он перейдет на http://localhost/overred/default.aspx
и может захватить некоторые параметры по умолчанию, такие как id, который представляет собой число после вашего d (последнее должно быть числом), чтобы вы могли отобразить идентификатор. как 123 статья.
Если в переписанном URL-адресе создается обратная передача, она будет передана в d123.aspx, так что пользователь увидит фактический адрес при нажатии кнопки. MSDN говорит: Но с точки зрения пользователя, если пользователь нажимает кнопку, они могут. беспокоиться из-за внезапных изменений URL-адреса.
Видно, что мс считает клиентов своим Богом! (Правда? #¥%…—*)
Продолжая цитировать ms:
Это происходит потому, что при отображении веб-формы ее свойству action присваивается непосредственно значение пути к файлу в объекте Request. Конечно, при отображении веб-формы URL-адрес был перезаписан с /Products/Beverages.aspx на ListProductsByCategory.aspx?CategoryID=1, что указывает на то, что объект Request сообщает, что пользователь хочет получить доступ к ListProductsByCategory.aspx?CategoryID=1. . Эту проблему можно решить, просто заставив форму на стороне сервера не отображать свойства действия. (По умолчанию браузер отправит ответный ответ, если форма не содержит свойств действия.)
К сожалению, веб-формы не позволяют явно указывать свойства действия, а также не позволяют устанавливать определенные свойства для отключения отрисовки свойств действия. . Поэтому мы должны сами расширить класс System.Web.HtmlControls.HtmlForm, переопределить метод RenderAttribute() и явно указать, что он не отображает атрибуты действия.
Благодаря функции наследования мы можем получить всю функциональность класса HtmlForm и добиться желаемого поведения, всего лишь добавив несколько строк кода. Ниже показан полный код пользовательского класса:
пространство имен ActionlessForm {
Форма открытого класса: System.Web.UI.HtmlControls.HtmlForm
{
защищенное переопределение void RenderAttributes (писатель HtmlTextWriter)
{
Writer.WriteAttribute("имя", this.Name);
base.Attributes.Remove("имя");
WriteAttribute("Метод", this.Method);
base.Attributes.Remove("метод");
this.Attributes.Render
(писатель);
base.Attributes.Remove("действие");
Writer.WriteAttribute("id", base.ClientID);
}
}
}
Код переопределенного метода RenderAttributes() содержит только точный код метода RenderAttributes() класса HtmlForm без установки атрибутов действия. (Я использовал Reflector Лутца Редера для просмотра исходного кода класса HtmlForm.)
После того как вы создадите этот класс и скомпилируете его, чтобы использовать его в веб-приложении ASP.NET, вы должны сначала добавить его в файл ссылок веб-приложения Clamped. . Затем, чтобы использовать его вместо класса HtmlForm, просто добавьте следующее в начало веб-страницы ASP.NET:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm"
Assembly="ActionlessForm" %>
Затем замените <form runat="server"> (если есть) на:
<skm:Form id="Form1" метод="post" runat="server">
и справа < Замените тег /form> с:
</skm:Form>
Вышеупомянутое предназначено для наследования формы. На самом деле существует более простой способ — наследовать страницу, поэтому вам не нужно ничего менять на странице aspx. .
Код:
использование системы;
использование System.IO;
использование System.Web;
URL-адреса пространства имен
System.Web.UI;
{
/**//// <сводка>
/// Базовый класс страницы www.downcodes.com
/// </сводка>
открытый класс OLPage: Страница
{
общедоступная OLPage()
{
}
/**//// <сводка>
/// Переопределить метод HtmlTextWriter по умолчанию и изменить атрибут value в теге формы, чтобы его значение было переписанным URL-адресом, а не реальным URL-адресом.
/// </сводка>
/// <param name="writer"></param>
защищенное переопределение void Render (писатель HtmlTextWriter)
{
if (писатель — System.Web.UI.Html32TextWriter)
{
писатель = новый FormFixerHtml32TextWriter(writer.InnerWriter);
}
еще
{
писатель = новый FormFixerHtmlTextWriter(writer.InnerWriter);
}
Base.Render(писатель);
}
}
внутренний класс FormFixerHtml32TextWriter: System.Web.UI.Html32TextWriter
{
частная строка _url // Поддельный URL-адрес
внутренний FormFixerHtml32TextWriter(TextWriterwriter):base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
Публичное переопределение void WriteAttribute (имя строки, значение строки, логическое кодирование)
{
// Если текущий выходной атрибут является атрибутом действия тега формы, замените его значение переписанным поддельным URL-адресом.
if (_url != null && string.Compare(name, «action», true) == 0)
{
значение = _url;
}
base.WriteAttribute(имя, значение, кодирование);
}
}
внутренний класс FormFixerHtmlTextWriter: System.Web.UI.HtmlTextWriter
{
частная строка _url;
внутренний FormFixerHtmlTextWriter (писатель TextWriter): база (писатель)
{
_url = HttpContext.Current.Request.RawUrl;
}
Публичное переопределение void WriteAttribute (имя строки, значение строки, логическое кодирование)
{
if (_url != null && string.Compare(name, «action», true) == 0)
{
значение = _url;
}
base.WriteAttribute(имя, значение, кодирование);
}
}
}
Вы инкапсулируете его в dll и можете извлечь его позже, просто добавив ссылку!
ок, это так просто!