Tại sao các biểu mẫu web ASP.NET cần thuộc tính Runat = phiên bản Server Server?


205

Tại sao tôi phải chỉ định runat="server"trên tất cả các điều khiển ASP.NET của mình khi nó là thuộc tính bắt buộc và serverlà tùy chọn duy nhất có sẵn trong kiến ​​thức hạn chế của tôi về ASP.NET và tôi gặp lỗi nếu tôi không sử dụng nó?

Tôi hiểu rằng tôi có thể tùy ý sử dụng nó trên các thẻ HTML của mình và tôi hiểu mô hình máy khách / máy chủ và những gì nó thực sự được chỉ định.

Đây có phải là một thẻ dự phòng có thể được ngụ ý bởi điều khiển là một điều khiển ASP.NET, hay có một lý do cơ bản nào không?


2
Tôi đồng ý với câu hỏi này, để làm rõ hơn một chút, không phải là 'asp:' (và các thẻ khác bạn chỉ định trong tiêu đề) đủ để phân tích? hoặc là runat bị tấn công sau khi điều khiển đã được chuyển đổi thành INPUT, do đó không thể phân biệt được với các HTML khác? Tôi nghĩ rằng runat sẽ bị tấn công trong khi nó vẫn ở dạng điều khiển máy chủ ...
chấp nhận

1
Có lẽ việc thêm một loại tùy chọn cấu hình " thuộc tính mặc định ", có thể là tiền tố hoặc tên dựa trên Web.config, sẽ là một cách giải quyết phù hợp. Trong quá trình phân tích cú pháp, các thuộc tính mặc định có thể được đưa vào DOM khi cần thiết. Tôi sẽ chơi với ý tưởng này ...
Dan Lugg

Câu trả lời:


112

Tôi luôn tin rằng có nhiều hơn để hiểu rằng bạn có thể trộn các thẻ ASP.NET và Thẻ HTML và Thẻ HTML có tùy chọn là runat="server"hoặc không. Không để lại bất cứ điều gì khi để thẻ vào và nó gây ra lỗi trình biên dịch. Càng nhiều điều bạn ngụ ý về ngôn ngữ web, càng dễ dàng cho một lập trình viên vừa chớm nở và học nó. Đó là một lý do tốt như bất kỳ để được dài dòng về các thuộc tính thẻ.

Cuộc trò chuyện này đã diễn ra trên Blog của Mike Schinkel giữa anh và Talbot Crowell của Microsoft National Services. Thông tin liên quan ở bên dưới (đoạn đầu tiên được diễn giải do lỗi ngữ pháp trong nguồn):

[...] Nhưng tầm quan trọng của <runat="server">nhiều hơn là tính nhất quán và khả năng mở rộng.

Nếu nhà phát triển phải đánh dấu một số thẻ (viz. <asp: />) Để ASP.NET Engine bỏ qua, thì cũng có vấn đề tiềm ẩn về xung đột không gian tên giữa các thẻ và các cải tiến trong tương lai. Bằng cách yêu cầu <runat="server">thuộc tính, điều này bị phủ định.

Nó tiếp tục:

Nếu <runat=client>được yêu cầu cho tất cả các thẻ phía máy khách, trình phân tích cú pháp sẽ cần phân tích tất cả các thẻ và loại bỏ <runat=client>phần đó.

Ông tiếp tục:

Hiện nay, Nếu tôi đoán là đúng, phân tích cú pháp đơn giản là bỏ qua tất cả văn bản (thẻ hoặc không có thẻ) trừ khi nó là một thẻ với runat=serverthuộc tính hay “một <%” tiền tố hoặc ssi “ <!– #include... (...) Ngoài ra, vì ASP.NET được thiết kế để cho phép tách các nhà thiết kế web (foo.aspx) khỏi các nhà phát triển web (foo.aspx.vb), các nhà thiết kế web có thể sử dụng các công cụ thiết kế web của riêng họ để đặt HTML và JavaScript phía máy khách mà không cần phải biết về ASP.NET thẻ hoặc thuộc tính cụ thể.


59
Dù lý do là gì đi nữa, đó vẫn là một PITA phải nhập nó cho mọi thẻ <asp:> khi nó có thể là giá trị mặc định một cách an toàn.
belugabob

33

Tôi thường không muốn đoán, nhưng tôi sẽ tiếp tục điều này ...

Nếu bạn còn nhớ quảng cáo tiếp thị .NET của Microsoft ngày trước (2001?), Thật khó để nói .NET là gì. Có phải là một máy chủ? một nền tảng lập trình? một ngôn ngữ? một cái gì đó hoàn toàn mới? Với các quảng cáo, nó mơ hồ là bất cứ điều gì bạn muốn - nó chỉ giải quyết bất kỳ vấn đề nào bạn có thể có.

Vì vậy, tôi đoán là có một tầm nhìn lớn ẩn giấu rằng mã ASP.NET có thể chạy ở bất cứ đâu - phía máy chủ HOẶC phía máy khách, trong một bản sao của Internet Explorer gắn liền với thời gian chạy .NET. runat = "server" chỉ là tàn dư tiền đình, bị bỏ lại vì tương đương phía khách hàng không bao giờ được đưa vào sản xuất.

Ghi nhớ những quảng cáo kỳ lạ?

Liên quan: Bài viết từ Đăng ký với một số lịch sử .NET.


5
Bạn có tình cờ có một liên kết đến một trang web có bất kỳ "quảng cáo lạ" nào không?
RandomWebGuy

Vâng, tôi nhớ những quảng cáo kỳ lạ. thở dài
catfood

13

Không phải tất cả các điều khiển có thể được bao gồm trong một trang phải được chạy tại máy chủ. Ví dụ:

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

Điều này về cơ bản giống như:

<asp:Button runat=server />

Xóa thẻ runat = server khỏi thẻ đầu tiên và bạn có nút HTML tiêu chuẩn chạy trong trình duyệt. Có nhiều lý do để chống lại việc chạy một điều khiển cụ thể tại máy chủ và không có cách nào để ASP.NET "giả sử" những gì bạn muốn dựa trên đánh dấu HTML mà bạn đưa vào. Có thể "suy luận" runat = server cho nhóm <asp:XXX />điều khiển, nhưng tôi đoán là Microsoft sẽ xem xét việc hack cú pháp đánh dấu và công cụ ASP.NET.


2
Nếu một điều khiển đang chạy trên máy chủ, điều đó có nghĩa là bạn không thể chọn các thành phần bằng Javascript? ví dụ: document.getElementsById ("tvns: treeview");
Ciaran Gallagher

3
Phần tử vẫn sẽ có trong DOM tại máy khách, do đó vẫn có thể sửa đổi nó bằng cách sử dụng javascript / jQuery. Tuy nhiên, làm việc với các phần tử kết xuất máy chủ có thể khó khăn, đặc biệt là với các điều khiển động.
Dave Swersky

8

Bài viết của Microsoft Msd Điều khiển bị lãng quên: Điều khiển máy chủ HTML giải thích việc sử dụng runat = "server" với một ví dụ trên hộp văn bản <input type="text">bằng cách chuyển đổi nó thành<input type="text" id="Textbox1" runat="server">

Làm điều này sẽ cung cấp cho bạn quyền truy cập theo chương trình vào phần tử HTML trên máy chủ trước khi trang Web được tạo và gửi xuống máy khách. Phần tử HTML phải chứa thuộc tính id. Thuộc tính này phục vụ như một danh tính cho thành phần và cho phép bạn lập trình cho các thành phần bằng ID cụ thể của chúng. Ngoài thuộc tính này, phần tử HTML phải chứa runat = "server". Điều này cho máy chủ xử lý biết rằng thẻ được xử lý trên máy chủ và không được coi là một thành phần HTML truyền thống.

Nói tóm lại, để cho phép truy cập theo chương trình vào phần tử HTML thêm runat="server"vào nó.


2
Không giải quyết câu hỏi, đó là câu hỏi tại sao runat = "server" là bắt buộc trên các thẻ ASP.NET.
nhahtdh

3
@nhahtdh Câu trả lời là: "để cho phép truy cập theo chương trình vào phần tử HTML". :)
Nhà phát triển Marius ilėnas

2
OP biết thẻ có nghĩa là gì và nó làm gì. Câu hỏi được đặt ra là về mặt thiết kế ngôn ngữ - điều gì khiến nhà thiết kế quyết định rằng ngay cả các thẻ ASP.NET cũng cần được đánh dấu bằng runat = "server" để được chạy ở phía máy chủ.
nhahtdh

@nhahtdh câu trả lời của bạn là gì?
Nhà phát triển Marius ilėnas

2
Tôi không có câu trả lời, nhưng câu trả lời hàng đầu giải quyết câu hỏi (đúng hay không). Câu trả lời của bạn thì không, và đó là lý do cho nhận xét của tôi.
nhahtdh

3

Sự nghi ngờ của tôi là nó liên quan đến cách xác định các điều khiển phía máy chủ trong quá trình xử lý. Thay vì phải kiểm tra mọi điều khiển trong thời gian chạy theo tên để xác định xem có cần thực hiện xử lý phía máy chủ hay không, nó thực hiện lựa chọn trên biểu diễn nút bên trong theo thẻ. Trình biên dịch kiểm tra để đảm bảo rằng tất cả các điều khiển yêu cầu thẻ máy chủ đều có chúng trong bước xác thực.


2

Các phần tử HTML trong các tệp ASP.NET, theo mặc định, được coi là văn bản. Để làm cho các phần tử này được lập trình, hãy thêm một runat="server"thuộc tính cho phần tử HTML. Thuộc tính này chỉ ra rằng phần tử nên được coi là điều khiển máy chủ.


1

Nó ở đó bởi vì tất cả các điều khiển trong ASP .NET kế thừa từ System.Web.UI.Control có thuộc tính "runat".

trong lớp System.Web.UI.HTMLControl, tuy nhiên, thuộc tính không bắt buộc, tuy nhiên, trong lớp System.Web.UI.WebControl thuộc tính được yêu cầu.

chỉnh sửa: hãy để tôi được cụ thể hơn. vì asp.net gần như là một bản tóm tắt của HTML, trình biên dịch cần một số loại lệnh để nó biết rằng thẻ cụ thể cần chạy phía máy chủ. nếu thuộc tính đó không có thì sẽ không biết xử lý nó trên máy chủ trước. nếu nó không ở đó, nó giả sử nó là đánh dấu thường xuyên và chuyển nó cho khách hàng.


3
Câu trả lời của bạn là câu hỏi rất được điều chỉnh.
Pablo Fernandez

2
Câu trả lời của tôi chỉ đơn giản là nói rằng thuộc tính runat là do thừa kế. Tôi xin lỗi vì đã không rõ ràng.
Nga Bradberry

3
Một chút quá cao trong ngăn xếp, tôi sợ, câu hỏi của tôi là về lý do tại sao nó ở đó ngay từ đầu. Dù sao cũng cảm ơn
johnc

2
Một lần nữa, không thực sự trả lời câu hỏi, nhưng tôi thấy những gì bạn đang cố gắng nói
johnc

1

Tôi nghĩ rằng Microsoft có thể khắc phục sự mơ hồ này bằng cách làm cho trình biên dịch thêm thuộc tính runat trước khi trang được biên dịch, một cái gì đó giống như thứ xóa kiểu mà java có với các tổng quát, thay vì xóa, nó có thể viết runat = server bất cứ nơi nào nó nhìn thấy asp: tiền tố cho các thẻ, vì vậy nhà phát triển sẽ không cần phải lo lắng về nó.


1

Nếu bạn sử dụng nó trên các thẻ html thông thường, điều đó có nghĩa là bạn có thể điều khiển chúng theo cách lập trình trong các trình xử lý sự kiện, v.v., ví dụ thay đổi href hoặc lớp của thẻ neo khi tải trang ... chỉ làm điều đó nếu bạn phải, vì các thẻ html vanilla đi nhanh hơn.

Theo như điều khiển của người dùng và điều khiển máy chủ, không, họ sẽ không làm việc mà không có chúng, mà không đào sâu vào phần bên trong của bộ tiền xử lý aspx, không thể nói chính xác tại sao, nhưng sẽ đoán rằng vì có thể vì lý do chính đáng, họ chỉ viết Trình phân tích cú pháp theo cách đó, tìm kiếm những thứ được đánh dấu rõ ràng là "làm một cái gì đó".

Nếu @JonSkeet có mặt ở bất cứ đâu, có lẽ anh ta sẽ có thể cung cấp một câu trả lời tốt hơn nhiều.


0

Khi gửi dữ liệu đến máy chủ ASP.NET Web, các điều khiển được đề cập là Runat = máy chủ có thể được biểu diễn dưới dạng các đối tượng Dot Net trong Ứng dụng máy chủ. Bạn có thể nhập mã theo cách thủ công trong các điều khiển HTML hoặc người khác có thể sử dụng tùy chọn Run As Server bằng cách nhấp chuột phải trong dạng xem thiết kế. Các điều khiển ASP.NET sẽ tự động lấy thuộc tính này khi bạn kéo nó từ hộp công cụ, nơi thường các điều khiển HTML không có.


0

Thuộc tính khá dư thừa, xem xét thẻ "asp" rõ ràng là một yếu tố ASP và đủ để xác định nó là một yếu tố có thể truy cập được phía máy chủ.

Tuy nhiên, ở những nơi khác, nó được sử dụng để nâng các thẻ thông thường sẽ được sử dụng trong mã phía sau.


0

Tôi vừa đi đến kết luận này bằng cách dùng thử và lỗi: runat = "server" là cần thiết để truy cập các phần tử vào thời gian chạy ở phía máy chủ. Loại bỏ chúng, biên dịch lại và xem những gì sẽ xảy ra.


-5

runat="Server" cho biết việc gửi lại máy chủ sẽ xảy ra đối với "điều khiển" HTML.

Biểu mẫu web sử dụng postbackliên tục để báo hiệu cho máy chủ xử lý sự kiện kiểm soát trang.

.NET MVCtrang KHÔNG sử dụng postback(ngoại trừ một hình thức "submit"). MVCdựa vào JQUERYđể quản lý trang ở phía máy khách (do đó bỏ qua nhu cầu rất nhiều postbacktin nhắn đến máy chủ).

Vì vậy: .NETBiểu mẫu web ... sử dụng "runat"thuộc tính rất nhiều trong đánh dấu trang.

.NET MVChầu như không bao giờ sử dụng "runat"thuộc tính trong đánh dấu trang.

Hy vọng điều này sẽ giúp làm rõ lý do tại sao runatcần thiết ...


1
-1 Sự thật không chính xác và không trả lời câu hỏi.
Cristian Diaconescu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.