การสร้างตารางที่ปรับแต่งได้ด้วยปุ่ม CommandArgument ใน ASP.NET MVC

ในฐานะนักพัฒนา เรามักจะพบกับความท้าทายเมื่อมีการเปลี่ยนแปลงจากเฟรมเวิร์กหนึ่งไปยังอีกเฟรมเวิร์กหนึ่ง หากคุณมีประสบการณ์กับ ASP.NET WebForms คุณอาจประสบปัญหาเมื่อพยายามใช้ฟังก์ชันใน ASP.NET MVC โดยเฉพาะอย่างยิ่งเมื่อเกี่ยวข้องกับการสร้างองค์ประกอบตารางแบบโต้ตอบที่มีปุ่ม

ในบล็อกโพสต์นี้ เราจะตอบคำถามทั่วไป: จะสร้างตารางด้วยปุ่มที่มีคุณสมบัติ CommandArgument ใน ASP.NET MVC ได้อย่างไร? เราจะไม่เพียงแต่ชี้แจงปัญหา แต่ยังเสนอวิธีแก้ปัญหาที่แข็งแกร่งซึ่งตรงตามหลักการของ MVC

เข้าใจปัญหา

ปัญหาจะเกิดขึ้นเมื่อคุณพยายามใช้ปุ่ม WebForms ในแอปพลิเคชัน ASP.NET MVC นี่คือตัวอย่างโครงสร้างตารางที่คุณอาจพยายามสร้าง:

<div>
    <table>
        <thead>
            <tr>
                <td>ชื่อพอร์ต</td>
                <td>เวอร์ชันพอร์ตปัจจุบัน</td>
                <td>เวอร์ชันพอร์ตใหม่</td>
                <td>อัปเดต</td>
            </tr>
        </thead>
        <% foreach (var ip in Ports) { %>
            <tr>
                <td><%= ip.PortName %></td>
                <td><%= ip.CurrentVersion %></td>
                <td><%= ip.NewVersion %></td>
                <td>
                    <asp:Button ID="btnUpdate" runat="server" Text="อัปเดต"
                        CommandArgument="<% ip.PortName %>" />
                </td>
            </tr>
        <% } %>
    </table>
</div>

ในโค้ดนี้ คุณอาจได้รับข้อผิดพลาดที่เกี่ยวข้องกับการไม่สามารถระบุได้ว่า ip คืออะไรในคุณสมบัติ CommandArgument ซึ่งเกิดจากความแตกต่างพื้นฐานในวิธีที่ ASP.NET MVC ประมวลผลมุมมองเมื่อเปรียบเทียบกับ WebForms

วิธีแก้ปัญหา: การใช้งานปุ่มใน ASP.NET MVC อย่างถูกต้อง

นี่คือสองวิธีที่มีประสิทธิภาพในการบรรลุฟังก์ชันที่ต้องการในขณะที่ยึดตามกฎของ MVC:

ตัวเลือกที่ 1: การใช้แท็ก Input

  1. เปลี่ยนปุ่ม WebForms เป็นองค์ประกอบ input หรือ button ของ HTML
  2. บรรจุปุ่มในองค์ประกอบแบบฟอร์ม ที่ชี้ไปที่การทำงานของตัวควบคุมเพื่อจัดการการอัปเดต

นี่คือวิธีที่คุณสามารถจัดโครงสร้างตารางของคุณด้วยปุ่ม input:

<div>
    <table>
        <thead>
            <tr>
                <td>ชื่อพอร์ต</td>
                <td>เวอร์ชันพอร์ตปัจจุบัน</td>
                <td>เวอร์ชันพอร์ตใหม่</td>
                <td>อัปเดต</td>
            </tr>
        </thead>
        @foreach (var ip in Ports)
        {
            <tr>
                <td>@ip.PortName</td>
                <td>@ip.CurrentVersion</td>
                <td>@ip.NewVersion</td>
                <td>
                    <form action="/ControllerName/ActionName" method="post">
                        <input type="hidden" name="portName" value="@ip.PortName" />
                        <input type="submit" value="อัปเดต" />
                    </form>
                </td>
            </tr>
        }
    </table>
</div>

ตัวเลือกที่ 2: การใช้ลิงก์ที่มี Query Strings

ทางเลือกอีกอย่างหนึ่งคือการใช้ลิงก์เพื่อไปยังการดำเนินการ คุณสามารถส่งผ่านพารามิเตอร์ที่จำเป็นผ่าน query string

<div>
    <table>
        <thead>
            <tr>
                <td>ชื่อพอร์ต</td>
                <td>เวอร์ชันพอร์ตปัจจุบัน</td>
                <td>เวอร์ชันพอร์ตใหม่</td>
                <td>อัปเดต</td>
            </tr>
        </thead>
        @foreach (var ip in Ports)
        {
            <tr>
                <td>@ip.PortName</td>
                <td>@ip.CurrentVersion</td>
                <td>@ip.NewVersion</td>
                <td>
                    <a href="/ControllerName/ActionName?portName=@ip.PortName">อัปเดต</a>
                </td>
            </tr>
        }
    </table>
</div>

สรุป

แม้ว่าการเปลี่ยนจาก ASP.NET WebForms ไปยัง MVC จะท้าทาย แต่การเข้าใจความแตกต่างในออกแบบเฟรมเวิร์กจะช่วยให้คุณนำเสนอวิธีแก้ปัญหาที่มีการ encapsulation มากขึ้นและมาตรฐานมากขึ้น

ประเด็นสำคัญ:

  • หลีกเลี่ยงการใช้ส่วนประกอบ WebForms ใน MVC
  • ใช้ HTML elements (input หรือ hyperlinks) แทน asp:Button
  • ตรวจสอบให้แน่ใจว่าการดำเนินการจะย้อนกลับไปยังตัวควบคุมของคุณ ทำให้สามารถจัดการข้อมูลแบบไดนามิกได้

โดยการปฏิบัติตามวิธีการเหล่านี้ คุณสามารถสร้างตารางที่มีโครงสร้างดีและแบบโต้ตอบในแอปพลิเคชัน ASP.NET MVC ของคุณ ซึ่งจะมอบประสบการณ์การใช้งานที่ยอดเยี่ยมโดยไม่ต้องมีความยุ่งยากจากโครงสร้างโค้ดเก่า

หากคุณมีคำถามหรือความคิดเห็นเพิ่มเติมเกี่ยวกับหัวข้อนี้ กรุณาแสดงความคิดเห็นในส่วนที่ให้ไว้!