บทนำ: Anthem เป็นเฟรมเวิร์ก Ajax ที่มีประโยชน์ซึ่งรองรับ ASP.NET 1.1, 2.0
เนื่องจากการควบคุมทั้งหมดในเฟรมเวิร์กนี้สืบทอดมาจากการควบคุมเซิร์ฟเวอร์ของ ASP.NET คุณสมบัติและพฤติกรรมเกือบทั้งหมดของการควบคุมเหล่านี้จึงยังคงอยู่ (ยกเว้นการเปลี่ยน PostBack เป็นการเรียกที่ไม่รีเฟรชของ CallBack) ดังนั้นช่วงการเรียนรู้จึงอ่อนโยนมาก
วันนี้ฉันพบปัญหาการแก้ไขจุดบกพร่องที่ยุ่งยากเมื่อใช้ Anthem ซึ่งได้รับการบันทึกไว้ที่นี่
ในโค้ดด้านล่าง ฉันใช้ตัวควบคุม Anthem.Repeater
<asp:XmlDataSource ID = "XmlDataSource2" runat = "เซิร์ฟเวอร์" XPath = "//NeedDocs/Doc"
EnableCaching="false"></asp:XmlDataSource>
<table class="mytable" width="100%" cellspacing="0" cellpadding="0">
<เพลง:Repeater ID = "rptNeedDocs" runat = "เซิร์ฟเวอร์" DataSourceID = "XmlDataSource2"
AutoUpdateAfterCallBack="False">
<เทมเพลตส่วนหัว>
<tr class="formTitle">
<td>
เลือก</td>
<td>
ชื่อไฟล์และรูปวาด</td>
<td>
ควรส่ง</td>
<td>
มันเป็นต้นฉบับเหรอ?</td>
<td>
หมายเหตุ</td>
</tr>
</เทมเพลตส่วนหัว>
<เทมเพลตรายการ>
<tr>
<td>
<asp:CheckBox ID="chkDoc" runat="เซิร์ฟเวอร์" เลือก = "True" />
<asp:HiddenField ID="hidDocId" runat="server" Value='<%# XPath("@Id") %>' />
</td>
<td>
<asp:Label ID="lblDocName" runat="server" Text='<%# XPath("@Name") %>' />
</td>
<td>
<asp:TextBox ID="txtQuantity" runat="server" Text='<%# XPath("@Quantity") %>' ความกว้าง = "30" />
</td>
<td>
<asp:RadioButtonList ID="radiolist_IsOriginal" runat="server" SelectedValue='<%# XPath("@IsOriginal") %>'
ทำซ้ำทิศทาง = "แนวนอน">
<asp:ListItem Value="True">ต้นฉบับ</asp:ListItem>
<asp:ListItem Value="False">คัดลอก</asp:ListItem>
</asp:RadioButtonList>
</td>
<td>
<asp:TextBox ID="txtComment" runat="server" Text='<%# XPath("ความคิดเห็น") %>' />
</td>
</tr>
</เทมเพลตรายการ>
<เทมเพลตส่วนท้าย>
</เทมเพลตส่วนท้าย>
</เพลง:รีพีทเตอร์>
</ตาราง>
เมื่อเรียกใช้โค้ดนี้ บางครั้งข้อผิดพลาด JS จะเกิดขึ้น: "ข้อผิดพลาดรันไทม์ที่ไม่รู้จัก"
และข้อผิดพลาดนี้เกิดขึ้นเฉพาะในสถานการณ์เฉพาะเท่านั้น และเป็นเรื่องปกติในสถานการณ์อื่นๆ ที่คล้ายคลึงกัน
โชคดีที่ VS 2005 มีความสามารถในการดีบักสคริปต์ฝั่งไคลเอ็นต์ที่ทรงพลังมาก ในที่สุดฉันก็ระบุข้อผิดพลาดในบรรทัดโค้ดที่สร้างโดย Anthem:
control.innerHTML = result.controls [รหัสควบคุม];
หลังจากตรวจสอบข้อมูลที่เกี่ยวข้องแล้ว ฉันพบว่าภายใต้ IE เมื่อกำหนดค่าให้กับแอตทริบิวต์ innerHTML ค่าที่กำหนดจะถูกตรวจสอบ หากไม่ได้มีรูปแบบที่ดี อาจเกิด "ข้อผิดพลาดรันไทม์ที่ไม่รู้จัก" ได้
ดังนั้นฉันจึงตัดสินว่ามีบางอย่างผิดปกติกับเอาต์พุต HTML โดย anthem.Repeater ดังที่คุณเห็นจากสองบรรทัดที่ไฮไลต์ในโค้ดด้านบน ป้ายตารางอยู่นอก Repeater ดังนั้นตัว Repeater จะส่งเอาต์พุตเป็นชุด tr ไม่ใช่ทั้งหมดที่มีรูปแบบที่ดี
ดังนั้นฉันจึงใส่ส่วนหัวและส่วนท้ายของแท็กตารางลงใน HeaderTemplate และ FooterTemplate ของ Repeater ตามลำดับ และปัญหาก็ได้รับการแก้ไข
(สาเหตุที่ผมวางแท็กตารางไว้ด้านนอกก่อนหน้านี้ก็เพราะว่าเมื่อผมใส่ไว้ใน HeaderTemplate และ FooterTemplate แล้ว ผมไม่รู้ว่าทำไม VS Designer จึงไม่สามารถเปลี่ยนไปใช้ Design View ได้ การเปลี่ยนแบบนี้จะช่วยแก้ปัญหาได้ )
หลังจากแก้ไขสำเร็จแล้ว จะได้โค้ดดังนี้
<asp:XmlDataSource ID = "XmlDataSource2" runat = "เซิร์ฟเวอร์" XPath = "//NeedDocs/Doc"
EnableCaching="false"></asp:XmlDataSource>
<เพลง:Repeater ID = "rptNeedDocs" runat = "เซิร์ฟเวอร์" DataSourceID = "XmlDataSource2" AutoUpdateAfterCallBack = "เท็จ">
<เทมเพลตส่วนหัว>
<table class="mytable" width="100%" cellspacing="0" cellpadding="0">
<tr class="formTitle">
<td>
เลือก</td>
<td>
ชื่อไฟล์และรูปวาด</td>
<td>
ควรส่ง</td>
<td>
มันเป็นต้นฉบับเหรอ?</td>
<td>
หมายเหตุ</td>
</tr>
</เทมเพลตส่วนหัว>
<เทมเพลตรายการ>
<tr>
<td>
<asp:CheckBox ID="chkDoc" runat="เซิร์ฟเวอร์" เลือก = "True" />
<asp:HiddenField ID="hidDocId" runat="server" Value='<%# XPath("@Id") %>' />
</td>
<td>
<asp:Label ID="lblDocName" runat="server" Text='<%# XPath("@Name") %>' />
</td>
<td>
<asp:TextBox ID="txtQuantity" runat="server" Text='<%# XPath("@Quantity") %>' ความกว้าง = "30" />
</td>
<td>
<asp:RadioButtonList ID="radiolist_IsOriginal" runat="server" SelectedValue='<%# XPath("@IsOriginal") %>'
ทำซ้ำทิศทาง = "แนวนอน">
<asp:ListItem Value="True">ต้นฉบับ</asp:ListItem>
<asp:ListItem Value="False">คัดลอก</asp:ListItem>
</asp:RadioButtonList>
</td>
<td>
<asp:TextBox ID="txtComment" runat="server" Text='<%# XPath("ความคิดเห็น") %>' />
</td>
</tr>
</เทมเพลตรายการ>
<เทมเพลตส่วนท้าย>
</ตาราง>
</เทมเพลตส่วนท้าย>
</เพลง:รีพีทเตอร์>
หลังจากการดีบักครั้งนี้ ฉันรู้สึกว่านอกเหนือจากประโยชน์ของการตอบสนองที่รวดเร็วบนอินเทอร์เฟซแล้ว Ajax ยังเพิ่มความยากในการดีบักเนื่องจากมีการนำ js จำนวนมากมาใช้ ดังนั้นเมื่อนำไปใช้งาน คุณยังคงต้องตัดสินใจเลือกตาม สถานการณ์ คุณไม่สามารถใช้ Ajax สำหรับทุกสิ่ง
http://www.cnblogs.com/RChen/archive/2006/08/06/anthem_debug.html