การเขียน URL ใหม่คือการเขียนที่อยู่ URL ใหม่ (เหงื่อ^_^)
รายละเอียด: http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
ข้อดี: ย่อ url ฯลฯ
การใช้งาน: 1. ดาวน์โหลด URLRewrite.dll ของ ms แล้วใส่ลงใน bin ของคุณ
2 ตั้งค่าต่อไปนี้ใน web.config:
<?xml version="1.0" encoding="utf-8" ?>
<การกำหนดค่า>
<configSections>
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />
</configSections>
<RewriterConfig>
<กฎ>
<RewriterRule>
<LookFor>~/d(d+).aspx</LookFor>
<SendTo>~/default.aspx?id=$1</SendTo>
</RewriterRule>
/กฎ
></RewriterConfig>
<system.web>
<httpHandlers>
<เพิ่มกริยา = "*" path = "*.aspx"
type = "URLRewriter.RewriterFactoryHandler, URLRewriter" />
</httpHandlers>
จากนั้นเขียนใน cs:
private void Page_Load(object sender, System.EventArgs e)
-
//ใส่รหัสผู้ใช้ที่นี่เพื่อเริ่มต้นเพจ
Response.Write(Request.QueryString["id"]+"<BR>");
Response.เขียน("5555");
}
เพียงป้อน
localhost/overred/d123.aspx (หมายเหตุ: จุดเริ่มต้นต้องเป็น d ตามด้วยตัวเลข)
อันที่จริง d123.aspx นี้เป็นเสมือนและไม่มีอยู่จริง ตราบใดที่มันเข้ากับรูปแบบ
มันจะข้ามไปที่ http://localhost/overred/default.aspx
และสามารถจับพารามิเตอร์บางตัวเป็นค่าเริ่มต้น เช่น id ซึ่งเป็นตัวเลขที่อยู่หลัง d ของคุณ (ตัวสุดท้ายต้องเป็นตัวเลข) เพื่อให้คุณสามารถแสดง id ได้ เป็นบทความที่ 123
หากมีการสร้าง postback ใน URL ที่เขียนใหม่ มันจะถูกส่งไปที่ d123.aspx เพื่อให้ผู้ใช้เห็นที่อยู่จริงเมื่อคลิกปุ่ม MSDN บอกว่า: แต่จากมุมมองของผู้ใช้ หากผู้ใช้คลิกปุ่ม พวกเขาอาจทำได้ ถูกรบกวนจากการเปลี่ยนแปลง URL อย่างกะทันหัน
จะเห็นได้ว่าคุณถือว่าลูกค้าคือพระเจ้าของเขา! (จริงเหรอ? #¥%…—*)
หากต้องการอ้างอิง ms ต่อไป:
สิ่งนี้เกิดขึ้นเพราะเมื่อเว็บฟอร์มถูกเรนเดอร์ มันจะตั้งค่าคุณสมบัติการดำเนินการเป็นค่าของพาธของไฟล์ในออบเจ็กต์คำขอโดยตรง แน่นอน เมื่อเว็บฟอร์มถูกเรนเดอร์ URL จะถูกเขียนใหม่จาก /Products/Beverages.aspx เป็น ListProductsByCategory.aspx?CategoryID=1 ซึ่งบ่งชี้ว่าออบเจ็กต์คำขอรายงานว่าผู้ใช้ต้องการเข้าถึง ListProductsByCategory.aspx?CategoryID=1 . เพียงแค่ทำให้ฟอร์มฝั่งเซิร์ฟเวอร์ไม่แสดงคุณสมบัติการดำเนินการช่วยแก้ปัญหานี้ได้ (ตามค่าเริ่มต้น เบราว์เซอร์จะโพสต์กลับถ้าแบบฟอร์มไม่มีคุณสมบัติการดำเนินการ)
ขออภัย เว็บฟอร์มไม่อนุญาตให้คุณระบุคุณสมบัติการดำเนินการอย่างชัดเจน และไม่อนุญาตให้คุณตั้งค่าคุณสมบัติบางอย่างเพื่อปิดใช้งานการแสดงผลคุณสมบัติการดำเนินการ . ดังนั้น เราจะต้องขยายคลาส System.Web.HtmlControls.HtmlForm ด้วยตัวเราเอง แทนที่เมธอด RenderAttribute() และระบุอย่างชัดเจนว่าคลาสดังกล่าวไม่แสดงแอตทริบิวต์ของการดำเนินการ
ต้องขอบคุณฟีเจอร์การสืบทอด เราจึงสามารถใช้งานฟังก์ชันทั้งหมดของคลาส HtmlForm และรับลักษณะการทำงานที่ต้องการได้เพียงเพิ่มโค้ดเพียงไม่กี่บรรทัด ต่อไปนี้แสดงรหัสที่สมบูรณ์ของคลาสที่กำหนดเอง:
namespace ActionlessForm {
แบบฟอร์มคลาสสาธารณะ: System.Web.UI.HtmlControls.HtmlForm
-
ป้องกันแทนที่เป็นโมฆะ RenderAttributes (ผู้เขียน HtmlTextWriter)
-
writer.WriteAttribute("ชื่อ", this.Name);
base.Attributes.Remove("ชื่อ");
writer.WriteAttribute("method", this.Method);
base.Attributes.Remove("method");
this.Attributes.Render
(ผู้เขียน);
base.Attributes.Remove("การกระทำ");
Writer.WriteAttribute("id", base.ClientID);
-
-
}
โค้ดสำหรับเมธอด RenderAttributes() ที่ถูกแทนที่จะมีเฉพาะโค้ดที่ตรงกันทุกประการสำหรับเมธอด RenderAttributes() ของคลาส HtmlForm โดยไม่ต้องตั้งค่าแอ็ตทริบิวต์การกระทำ (ฉันใช้ Lutz Roeder's Reflector เพื่อดูซอร์สโค้ดของคลาส HtmlForm)
หลังจากที่คุณสร้างคลาสนี้และคอมไพล์แล้ว หากต้องการใช้ในเว็บแอปพลิเคชัน ASP.NET คุณควรเพิ่มคลาสนั้นลงในไฟล์อ้างอิงของเว็บแอปพลิเคชันก่อน . จากนั้น หากต้องการใช้แทนคลาส HtmlForm เพียงเพิ่มสิ่งต่อไปนี้ที่ด้านบนของหน้าเว็บ ASP.NET ของคุณ:
<%@ Register TagPrefix="skm" Namespace="ActionlessForm"
Assembly="ActionlessForm" %>
จากนั้นแทนที่ <form runat="server"> (ถ้ามี) ด้วย:
<skm:Form id="Form1" method="post" runat="server">
และทางด้านขวา < แทนที่ แท็ก /form> ที่มี:
</skm:Form>
ด้านบนคือการสืบทอดแบบฟอร์ม จริงๆ แล้วมีวิธีที่ง่ายกว่านั้นคือการสืบทอดหน้า ดังนั้นคุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในหน้า aspx .
รหัส:
ใช้ระบบ;
ใช้ System.IO;
ใช้ System.Web;
ใช้ System.Web.UI;
เนมสเปซ URl
-
/***////// <สรุป>
/// คลาสพื้นฐานของหน้า www.downcodes.com
/// </สรุป>
OLPage คลาสสาธารณะ : หน้า
-
OLPage สาธารณะ ()
-
-
/***////// <สรุป>
/// แทนที่วิธี HtmlTextWriter เริ่มต้นและแก้ไขแอตทริบิวต์ค่าในแท็กแบบฟอร์มเพื่อให้ค่าของมันคือ URL ที่เขียนใหม่แทนที่จะเป็น URL จริง
/// </สรุป>
/// <param name="writer"></param>
ป้องกันแทนที่เป็นโมฆะ Render (ผู้เขียน HtmlTextWriter)
{
ถ้า (ผู้เขียนคือ System.Web.UI.Html32TextWriter)
-
นักเขียน = FormFixerHtml32TextWriter ใหม่ (writer.InnerWriter);
-
อื่น
-
นักเขียน = FormFixerHtmlTextWriter ใหม่ (writer.InnerWriter);
}
base.Render (ผู้เขียน);
-
-
คลาสภายใน FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
-
สตริงส่วนตัว _url; // URL ปลอม
ภายใน FormFixerHtml32TextWriter (ผู้เขียน TextWriter): ฐาน (ผู้เขียน)
-
_url = HttpContext.Current.Request.RawUrl;
}
การแทนที่สาธารณะถือเป็นโมฆะ WriteAttribute (ชื่อสตริง, ค่าสตริง, การเข้ารหัสบูล)
-
// หากแอตทริบิวต์เอาต์พุตปัจจุบันเป็นแอตทริบิวต์การกระทำของแท็กแบบฟอร์ม ให้แทนที่ค่าด้วย URL ปลอมที่เขียนใหม่
ถ้า (_url != null && string.Compare (ชื่อ "การกระทำ" จริง) == 0)
-
ค่า = _url;
-
base.WriteAttribute (ชื่อ, ค่า, เข้ารหัส);
-
-
คลาสภายใน FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
-
สตริงส่วนตัว _url;
FormFixerHtmlTextWriter ภายใน (ผู้เขียน TextWriter): ฐาน (ผู้เขียน)
-
_url = HttpContext.Current.Request.RawUrl;
}
การแทนที่สาธารณะถือเป็นโมฆะ WriteAttribute (ชื่อสตริง, ค่าสตริง, การเข้ารหัสบูล)
-
ถ้า (_url != null && string.Compare (ชื่อ "การกระทำ" จริง) == 0)
-
ค่า = _url;
}
base.WriteAttribute(ชื่อ, ค่า, เข้ารหัส);
-
}
}
คุณห่อหุ้มมันลงใน dll และคุณสามารถดึงมันได้ในภายหลังโดยเพียงแค่เพิ่มข้อมูลอ้างอิง!
โอเค มันง่ายมาก!