เหตุใดเว็บฟอร์ม ASP.NET จึงจำเป็นต้องมีแอตทริบิวต์ Runat =“ Server”


205

ทำไมฉันต้องระบุrunat="server"ในการควบคุม ASP.NET ทั้งหมดของฉันเมื่อมันเป็นคุณสมบัติบังคับและserverเป็นตัวเลือกเดียวที่มีอยู่ในความรู้ที่ จำกัด ของฉันเกี่ยวกับ ASP.NET และฉันได้รับข้อผิดพลาดหากฉันไม่ได้ใช้มัน?

ฉันเข้าใจว่าฉันสามารถเลือกที่จะใช้มันในแท็ก HTML ของฉันและฉันเข้าใจกระบวนทัศน์ไคลเอนต์ / เซิร์ฟเวอร์และสิ่งที่ระบุไว้จริง

มันเป็นแท็กที่ซ้ำซ้อนที่เพิ่งถูกบอกเป็นนัยโดยการควบคุมว่าเป็นตัวควบคุม ASP.NET หรือมีเหตุผลพื้นฐานหรือไม่?


2
ฉันเห็นด้วยกับคำถามนี้เพื่อชี้แจงเพิ่มเติมเล็กน้อย 'asp:' (และแท็กอื่น ๆ ที่คุณระบุในส่วนหัว) ไม่เพียงพอที่จะแยกวิเคราะห์? หรือ runat ได้รับผลกระทบหลังจากที่ตัวควบคุมถูกแปลงเป็น INPUT ดังนั้นจึงแยกไม่ออกจาก HTML อื่น ๆ ? ฉันคิดว่า runat จะได้รับผลกระทบในขณะที่มันยังคงอยู่ในรูปแบบการควบคุมเซิร์ฟเวอร์ ...
Abend

1
บางทีการเพิ่มประเภทของตัวเลือกการกำหนดค่า " แอตทริบิวต์เริ่มต้น " ซึ่งอาจเป็นคำนำหน้าหรือชื่อตามไปWeb.configจะเป็นวิธีแก้ปัญหาที่เหมาะสม ในระหว่างแอ็ตทริบิวต์เริ่มต้นกระบวนการวิเคราะห์คำสามารถฉีดลงใน DOM เมื่อจำเป็น ฉันจะเล่นกับความคิดนี้ ...
Dan Lugg

คำตอบ:


112

ฉันเชื่อเสมอว่ามันมีมากกว่าสำหรับความเข้าใจที่ว่าคุณสามารถผสมแท็ก ASP.NET และแท็ก HTML และแท็ก HTML มีตัวเลือกว่าจะเป็นrunat="server"หรือไม่ ไม่เจ็บอะไรเลยที่จะออกจากแท็กและมันทำให้เกิดข้อผิดพลาดของคอมไพเลอร์ที่จะนำมันออกมา ยิ่งคุณพูดถึงภาษาของเว็บมากเท่าไหร่คุณก็ยิ่งมีความเข้าใจภาษาโปรแกรมเมอร์น้อยลงเท่านั้น นั่นเป็นเหตุผลที่ดีพอ ๆ กับการใช้คุณสมบัติแท็ก

การสนทนานี้เกิดขึ้นกับบล็อกของ Mike Schinkel ระหว่างเขากับ Talbot Crowell ของ Microsoft National Services ข้อมูลที่เกี่ยวข้องอยู่ด้านล่าง (ย่อหน้าแรกถอดความเนื่องจากข้อผิดพลาดทางไวยากรณ์ในแหล่งที่มา):

[... ]แต่ความสำคัญของการ<runat="server">มีความสม่ำเสมอและความสามารถในการขยายเพิ่มเติม

หากผู้พัฒนาต้องทำเครื่องหมายแท็กบางอย่าง (viz. <asp: />) เพื่อให้เอนจิ้น ASP.NET ไม่สนใจแสดงว่ามีปัญหาที่อาจเกิดจากการชนของเนมสเปซระหว่างแท็กและการปรับปรุงในอนาคต โดยการกำหนด<runat="server">คุณลักษณะนี้จะถูกทำให้ไร้ผล

มันยังคง:

หาก<runat=client>จำเป็นสำหรับแท็กฝั่งไคลเอ็นต์ทั้งหมดตัวแยกวิเคราะห์จะต้องแยกวิเคราะห์แท็กทั้งหมดและถอด<runat=client>ส่วนออก

เขาพูดต่อ:

ปัจจุบันถ้าฉันเดาถูกต้อง parser เพียงละเว้นข้อความทั้งหมด (แท็กหรือไม่มีแท็ก) เว้นแต่เป็นแท็กที่มีการ runat=serverแอตทริบิวต์หรือ“ <%” คำนำหน้าหรือ SSI“ <!– #include... ( ... ) นอกจากนี้ตั้งแต่ ASP.NET ได้รับการออกแบบ เพื่ออนุญาตให้แยกนักออกแบบเว็บไซต์ (foo.aspx) จากนักพัฒนาเว็บ (foo.aspx.vb) นักออกแบบเว็บไซต์สามารถใช้เครื่องมือออกแบบเว็บไซต์ของตนเองเพื่อวาง HTML และ JavaScript ฝั่งไคลเอ็นต์โดยไม่ต้องรู้เกี่ยวกับ ASP.NET แท็กหรือแอตทริบิวต์เฉพาะ


59
ไม่ว่าด้วยเหตุผลใดก็ตามมันยังคงเป็น PITA ที่ต้องพิมพ์ลงในแท็ก <asp:> ทุกตัวเมื่อสามารถเป็นค่าเริ่มต้นได้อย่างปลอดภัย
belugabob

33

ฉันมักจะไม่ชอบที่จะคาดเดา แต่ฉันจะไปที่นี้ ...

ถ้าคุณจำได้ว่าการตลาด. NET ของไมโครซอฟท์ย้อนกลับไปในวันนั้น (2544?) มันก็ยากที่จะบอกว่า. NET คืออะไร มันเป็นเซิร์ฟเวอร์หรือไม่? แพลตฟอร์มการเขียนโปรแกรม? ภาษา? มีอะไรใหม่บ้าง? เมื่อได้รับโฆษณามันเป็นสิ่งที่คลุมเครือทุกอย่างที่คุณต้องการให้เป็น - เพียงแก้ไขปัญหาที่คุณอาจมี

ดังนั้นฉันเดาว่ามีวิสัยทัศน์ที่ซ่อนอยู่ที่รหัส ASP.NET สามารถทำงานได้ทุกที่ - ฝั่งเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์ในสำเนาของ Internet Explorer ที่เชื่อมโยงกับ. NET runtime runat = "เซิร์ฟเวอร์" เป็นเพียงเศษเสี้ยวที่เหลือทิ้งไว้เพราะมันเทียบเท่ากับฝั่งไคลเอ็นต์ที่ไม่เคยทำให้เกิดการผลิต

จำโฆษณาแปลก ๆ เหล่านั้นได้ไหม?

ที่เกี่ยวข้อง: บทความจาก The Register ที่มีประวัติ. NET บางส่วน


5
คุณมีลิงค์ไปยังเว็บไซต์ที่มีโฆษณาแปลก ๆ หรือไม่?
RandomWebGuy

ใช่ฉันจำโฆษณาแปลก ๆ ถอนหายใจ
catfood

13

ตัวควบคุมบางตัวเท่านั้นที่สามารถรวมอยู่ในหน้านั้นจะต้องทำงานที่เซิร์ฟเวอร์ ตัวอย่างเช่น:

<INPUT type="submit" runat=server />

นี่คือหลักเช่นเดียวกับ:

<asp:Button runat=server />

ลบแท็ก runat = เซิร์ฟเวอร์ออกจากแท็กแรกและคุณมีปุ่ม HTML มาตรฐานที่ทำงานในเบราว์เซอร์ มีเหตุผลสำหรับและต่อต้านการเรียกใช้ตัวควบคุมเฉพาะที่เซิร์ฟเวอร์และไม่มีทางที่ ASP.NET จะ "ถือว่า" สิ่งที่คุณต้องการโดยยึดตามมาร์กอัป HTML ที่คุณรวมไว้ อาจเป็นไปได้ "อนุมาน" เซิร์ฟเวอร์ runat = สำหรับ<asp:XXX />ตระกูลควบคุม แต่ฉันเดาว่า Microsoft จะพิจารณาว่าแฮ็กไปยังมาร์กอัปไวยากรณ์และเอ็นจิ้น ASP.NET


2
หากตัวควบคุมทำงานที่เซิร์ฟเวอร์นั่นหมายความว่าคุณไม่สามารถเลือกองค์ประกอบโดยใช้ Javascript ได้หรือไม่ เช่น document.getElementsById ("tvns: treeview");
Ciaran Gallagher

3
องค์ประกอบจะยังคงอยู่ใน DOM ที่ลูกค้าดังนั้นจึงยังสามารถแก้ไขได้โดยใช้ javascript / jQuery การทำงานกับองค์ประกอบที่เซิร์ฟเวอร์แสดงผลนั้นอาจเป็นเรื่องยุ่งยากโดยเฉพาะอย่างยิ่งกับการควบคุมแบบไดนามิก
Dave Swersky

8

บทความ Microsoft Msdn ตัวควบคุมที่ถูกลืม: การควบคุมเซิร์ฟเวอร์ HTMLอธิบายการใช้ runat = "เซิร์ฟเวอร์" พร้อมตัวอย่างบนกล่องข้อความ<input type="text">โดยแปลงเป็น<input type="text" id="Textbox1" runat="server">

การทำเช่นนี้จะช่วยให้คุณสามารถเข้าถึงองค์ประกอบ HTML บนเซิร์ฟเวอร์โดยทางโปรแกรมก่อนสร้างเว็บเพจและส่งลงไปยังไคลเอนต์ องค์ประกอบ HTML จะต้องมีแอตทริบิวต์ id คุณลักษณะนี้ทำหน้าที่เป็นข้อมูลประจำตัวสำหรับองค์ประกอบและช่วยให้คุณสามารถโปรแกรมองค์ประกอบโดยรหัสเฉพาะของพวกเขา นอกเหนือจากแอตทริบิวต์นี้องค์ประกอบ HTML จะต้องมี runat = "server" สิ่งนี้จะบอกเซิร์ฟเวอร์ประมวลผลว่าแท็กได้รับการประมวลผลบนเซิร์ฟเวอร์และไม่ถือว่าเป็นองค์ประกอบ HTML แบบดั้งเดิม

ในระยะสั้นเพื่อให้สามารถเข้าถึงโปรแกรมเพื่อองค์ประกอบ HTML เพิ่มrunat="server"ให้กับมัน


2
ไม่ได้ตอบคำถามซึ่งถามว่าทำไม runat = "server" จึงจำเป็นต้องใช้กับแท็ก ASP.NET
nhahtdh

3
@nhahtdh คำตอบคือ: "เพื่อเปิดใช้งานการเข้าถึงโดยทางโปรแกรมไปยังองค์ประกอบ HTML" :)
นักพัฒนา Marius Žilėnas

2
OP รู้ว่าแท็กหมายถึงอะไรและทำงานอย่างไร คำถามกำลังถามในแง่ของการออกแบบภาษา - สิ่งที่ทำให้นักออกแบบตัดสินใจว่าแม้แต่แท็ก ASP.NET จะต้องทำเครื่องหมายด้วย runat = "server" เพื่อให้ทำงานบนฝั่งเซิร์ฟเวอร์
nhahtdh

@nhahtdh คุณมีคำตอบอะไร
พัฒนา Marius Žilėnas

2
ฉันไม่มีคำตอบ แต่คำตอบยอดนิยมตอบคำถาม (ถูกต้องหรือไม่) คำตอบของคุณไม่ได้และนั่นเป็นเหตุผลสำหรับความคิดเห็นของฉัน
nhahtdh

3

ความสงสัยของฉันคือมันเกี่ยวข้องกับวิธีการระบุตัวควบคุมฝั่งเซิร์ฟเวอร์ในระหว่างการประมวลผล แทนที่จะต้องตรวจสอบทุกการควบคุมที่รันไทม์ด้วยชื่อเพื่อพิจารณาว่าการประมวลผลฝั่งเซิร์ฟเวอร์จำเป็นต้องทำหรือไม่มันเป็นการเลือกการแสดงโหนดภายในโดยใช้แท็ก คอมไพเลอร์ตรวจสอบเพื่อให้แน่ใจว่าการควบคุมทั้งหมดที่ต้องใช้แท็กเซิร์ฟเวอร์มีไว้ในขั้นตอนการตรวจสอบ


2

โดยปกติแล้วองค์ประกอบ HTML ในไฟล์ ASP.NET จะถือว่าเป็นข้อความ ในการทำให้องค์ประกอบเหล่านี้ตั้งโปรแกรมได้ให้เพิ่มrunat="server"แอตทริบิวต์ไปยังองค์ประกอบ HTML คุณลักษณะนี้บ่งชี้ว่าองค์ประกอบควรได้รับการปฏิบัติเป็นตัวควบคุมเซิร์ฟเวอร์


1

มันเป็นเพราะการควบคุมทั้งหมดใน ASP .NET สืบทอดมาจาก System.Web.UI.Control ซึ่งมีคุณลักษณะ "runat"

ในคลาส System.Web.UI.HTMLControl ไม่จำเป็นต้องใช้แอตทริบิวต์อย่างไรก็ตามในคลาส System.Web.UI.WebControl จำเป็นต้องมีแอตทริบิวต์

แก้ไข: ให้ฉันเจาะจงมากขึ้น asp.net นั้นค่อนข้างเป็นนามธรรมของ HTML คอมไพเลอร์จึงต้องการคำสั่งบางประเภทเพื่อให้ทราบว่าแท็กเฉพาะจำเป็นต้องใช้ฝั่งเซิร์ฟเวอร์ หากไม่มีแอตทริบิวต์นั้นจะไม่ทราบว่าจะดำเนินการกับเซิร์ฟเวอร์ก่อน ถ้ามันไม่ได้มีมันถือว่าเป็นมาร์กอัปปกติและส่งไปยังลูกค้า


3
คำตอบของคุณคือคำถามที่ปฏิรูปมาก
Pablo Fernandez

2
คำตอบของฉันเพียงแค่ระบุว่าคุณลักษณะ runat นั้นมีเนื่องจากการสืบทอด ฉันขอโทษที่ไม่ชัดเจน
Russ Bradberry

3
สูงเกินไปเล็กน้อยในสแต็คฉันกลัวคำถามของฉันเกี่ยวกับสาเหตุที่เกิดขึ้นตั้งแต่แรก ขอบคุณต่อไป
johnc

2
อีกครั้งไม่ได้จริงๆตอบคำถาม แต่ฉันเห็นสิ่งที่คุณกำลังพยายามที่จะพูด
johnc

1

ฉันคิดว่า Microsoft สามารถแก้ไขความคลุมเครือนี้ได้โดยการทำให้คอมไพเลอร์เพิ่ม runat attribute ก่อนที่จะรวบรวมหน้าบางอย่างเช่นสิ่งที่ลบประเภทที่ java มีกับ generics แทนที่จะลบมันอาจจะเขียน runat = เซิร์ฟเวอร์ทุกที่ที่เห็น asp: คำนำหน้าสำหรับแท็กดังนั้นผู้พัฒนาไม่จำเป็นต้องกังวล


1

ถ้าคุณใช้มันบนแท็ก html ปกติก็หมายความว่าคุณสามารถจัดการพวกมันในโปรแกรมจัดการเหตุการณ์ ฯลฯ โดยทางโปรแกรมเช่นเปลี่ยน href หรือคลาสของแท็กจุดยึดในการโหลดหน้า ... ทำอย่างนั้นถ้าคุณต้องเพราะแท็ก hilla วานิลลา ไปเร็วขึ้น

เท่าที่การควบคุมผู้ใช้และการควบคุมเซิร์ฟเวอร์ไม่พวกเขาจะไม่ทำงานโดยไม่มีพวกเขาโดยไม่ต้องเจาะลึกเข้าไปในอวัยวะภายในของตัวประมวลผลก่อนหน้าของ aspx ไม่สามารถบอกได้ว่าทำไม แต่คาดเดาด้วยเหตุผลที่ดี ตัวแยกวิเคราะห์แบบนั้นค้นหาสิ่งที่ทำเครื่องหมายไว้อย่างชัดเจนว่า "ทำอะไร"

หาก @JonSkeet อยู่ใกล้ ๆ เขาอาจจะสามารถให้คำตอบที่ดีกว่าได้


0

เมื่อส่งข้อมูลไปยังเว็บเซิร์ฟเวอร์ ASP.NET ตัวควบคุมที่กล่าวถึงเป็น Runat =“ เซิร์ฟเวอร์” จะถูกแสดงเป็นวัตถุ Dot Net ในแอปพลิเคชันเซิร์ฟเวอร์ คุณสามารถพิมพ์รหัสด้วยตนเองในตัวควบคุม HTML มิฉะนั้นสามารถใช้ตัวเลือกRun As Serverโดยคลิกขวาในมุมมองออกแบบ ตัวควบคุม ASP.NET จะได้รับคุณลักษณะนี้โดยอัตโนมัติเมื่อคุณลากจากกล่องเครื่องมือซึ่งโดยปกติแล้วตัวควบคุม HTML จะไม่ทำ


0

แอตทริบิวต์ซ้ำซ้อนสวยเมื่อพิจารณาแท็ก "asp" จะเห็นได้ชัดว่าเป็นองค์ประกอบของ ASP และควรจะเพียงพอที่จะระบุว่าเป็นองค์ประกอบที่เข้าถึงได้จากฝั่งเซิร์ฟเวอร์

ที่อื่นอย่างไรก็ตามมันเคยยกระดับแท็กปกติที่จะใช้ในโค้ด - หลัง


0

ฉันเพิ่งมาถึงข้อสรุปนี้โดยการทดลองและข้อผิดพลาด: runat = "เซิร์ฟเวอร์" เป็นสิ่งจำเป็นในการเข้าถึงองค์ประกอบในเวลาทำงานทางฝั่งเซิร์ฟเวอร์ ลบออกคอมไพล์ใหม่และดูว่าเกิดอะไรขึ้น


-5

runat="Server" ระบุว่าการโพสต์กลับไปยังเซิร์ฟเวอร์จะเกิดขึ้นสำหรับ HTML "การควบคุม"

เว็บฟอร์มใช้postbackอย่างต่อเนื่องเพื่อส่งสัญญาณเซิร์ฟเวอร์เพื่อประมวลผลเหตุการณ์การควบคุมหน้า

.NET MVCอย่าใช้หน้าpostback(ยกเว้นแบบฟอร์ม"submit") MVCอาศัยJQUERYการจัดการเพจฝั่งไคลเอ็นต์ (ดังนั้นจึงไม่ต้องมีpostbackข้อความจำนวนมากไปยังเซิร์ฟเวอร์)

ดังนั้น: .NETเว็บฟอร์ม ... ใช้"runat"แอตทริบิวต์มากในการมาร์กอัปหน้า

.NET MVCแทบจะไม่เคยใช้"runat"คุณลักษณะในมาร์กอัปหน้า

หวังว่านี่จะช่วยชี้แจงว่าทำไมจึงrunatจำเป็น ...


1
-1 ข้อเท็จจริงที่ไม่ถูกต้องและไม่ตอบคำถาม
Cristian Diaconescu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.