Mengapa formulir web ASP.NET memerlukan atribut Runat = "Server"?

205

Mengapa saya harus menentukan runat="server"pada semua kontrol ASP.NET saya ketika itu adalah atribut wajib dan servermerupakan satu-satunya pilihan yang tersedia dalam pengetahuan terbatas saya tentang ASP.NET, dan saya mendapatkan kesalahan jika saya tidak menggunakannya?

Saya mengerti bahwa saya dapat menggunakannya secara opsional pada tag HTML saya, dan saya mengerti paradigma klien / server dan apa yang sebenarnya ditentukan.

Apakah itu tag berlebihan yang hanya bisa tersirat oleh kontrol menjadi kontrol ASP.NET, atau apakah ada alasan yang mendasarinya?

John
sumber
2
Saya setuju dengan pertanyaan ini, untuk sedikit lebih memperjelas, bukankah 'asp:' (dan tag lain yang Anda tentukan di header) cukup untuk diurai? atau apakah runat terkena setelah kontrol telah dikonversi menjadi INPUT, sehingga tidak dapat dibedakan dari HTML lain? Saya akan berpikir runat akan terkena ketika masih dalam bentuk kontrol server ...
abend
1
Mungkin menambahkan semacam opsi konfigurasi " atribut default ", yang bisa berupa awalan atau berbasis nama, ke Web.config, akan menjadi solusi yang sesuai. Selama proses parse, atribut default dapat disuntikkan ke DOM jika perlu. Saya akan bermain dengan ide ini ...
Dan Lugg

Jawaban:

112

Saya selalu percaya itu ada lebih banyak untuk pemahaman bahwa Anda dapat mencampur tag ASP.NET dan Tag HTML, dan Tag HTML memiliki pilihan untuk menjadi runat="server"atau tidak. Tidak ada ruginya meninggalkan tag, dan itu menyebabkan kesalahan kompilator untuk mengeluarkannya. Semakin banyak hal yang Anda maksudkan tentang bahasa web, semakin tidak mudah bagi seorang programmer pemula untuk datang dan mempelajarinya. Itu alasan yang bagus untuk menjelaskan atribut tag.

Percakapan ini terjadi di Blog Mike Schinkel antara dirinya dan Talbot Crowell dari Microsoft National Services. Informasi yang relevan di bawah ini (paragraf pertama diparafrasekan karena kesalahan tata bahasa dalam sumber):

[...] tetapi pentingnya <runat="server">lebih untuk konsistensi dan diperpanjang.

Jika pengembang harus menandai beberapa tag (yaitu <asp: />) untuk diabaikan oleh ASP.NET Engine, maka ada juga potensi masalah tabrakan namespace di antara tag dan peningkatan di masa mendatang. Dengan memerlukan <runat="server">atribut, ini dinegasikan.

Itu berlanjut:

Jika <runat=client>diperlukan untuk semua tag sisi klien, parser harus mengurai semua tag dan menghapus <runat=client>bagian tersebut.

Dia melanjutkan:

Saat ini, Jika dugaan saya benar, pengurai hanya mengabaikan semua teks (tag atau tidak ada tag) kecuali itu adalah tag dengan runat=serveratribut atau " <%" awalan atau ssi " <!– #include... (...) Juga, karena ASP.NET dirancang untuk memungkinkan pemisahan perancang web (foo.aspx) dari pengembang web (foo.aspx.vb), perancang web dapat menggunakan alat perancang web mereka sendiri untuk menempatkan HTML dan JavaScript sisi klien tanpa harus mengetahui tentang ASP.NET tag atau atribut tertentu.

George Stocker
sumber
59
Apa pun alasannya, itu masih PITA yang harus mengetikkannya untuk setiap tag <asp:> saat itu bisa dengan aman menjadi nilai default.
belugabob
33

Saya biasanya tidak suka menebak, tapi saya akan membahas yang ini ...

Jika Anda ingat Microsoft. NET pemasaran hype kembali pada hari (2001?), Sulit untuk mengatakan apa itu. NET bahkan. Apakah itu server? platform pemrograman? sebuah bahasa? sesuatu yang sama sekali baru? Mengingat iklan, itu adalah ambigu apa pun yang Anda inginkan - hanya memecahkan masalah yang mungkin Anda miliki.

Jadi, dugaan saya adalah ada visi besar tersembunyi bahwa kode ASP.NET bisa berjalan di mana saja - sisi server ATAU sisi klien, dalam salinan Internet Explorer terkait dengan runtime .NET. runat = "server" hanyalah sisa-sisa peninggalan, tertinggal karena itu setara dengan sisi klien tidak pernah sampai ke produksi.

Ingat iklan-iklan aneh itu?

Terkait: Artikel dari Daftar dengan beberapa .NET history.

Corbin March
sumber
5
Apakah Anda memiliki tautan ke situs yang memiliki "iklan aneh"?
RandomWebGuy
Ya saya ingat iklan yang aneh. sigh
catfood
13

Tidak semua kontrol yang dapat dimasukkan dalam halaman harus dijalankan di server. Sebagai contoh:

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

Ini pada dasarnya sama dengan:

<asp:Button runat=server />

Hapus runat = tag server dari yang pertama dan Anda memiliki tombol HTML standar yang berjalan di browser. Ada alasan untuk dan tidak menjalankan kontrol tertentu di server, dan tidak ada cara bagi ASP.NET untuk "mengasumsikan" apa yang Anda inginkan berdasarkan markup HTML yang Anda sertakan. Mungkin saja untuk "menyimpulkan" server runat = untuk kelompok <asp:XXX />kontrol, tetapi tebakan saya adalah bahwa Microsoft akan mempertimbangkan peretasan ke sintaks markup dan mesin ASP.NET.

Dave Swersky
sumber
2
Jika kontrol berjalan di server, apakah itu berarti Anda tidak dapat memilih elemen menggunakan Javascript? mis. document.getElementsById ("tvns: treeview");
Ciaran Gallagher
3
Elemen masih akan berada di DOM di klien, jadi masih dimungkinkan untuk memodifikasinya menggunakan javascript / jQuery. Namun, bekerja dengan elemen-elemen yang dirender oleh server bisa rumit, terutama dengan kontrol dinamis.
Dave Swersky
8

Microsoft Msdn artikel Kontrol Terlupakan: Kontrol Server HTML menjelaskan penggunaan runat = "server" dengan contoh pada kotak teks <input type="text">dengan mengonversinya menjadi<input type="text" id="Textbox1" runat="server">

Melakukan hal ini akan memberi Anda akses terprogram ke elemen HTML di server sebelum halaman Web dibuat dan dikirim ke klien. Elemen HTML harus mengandung atribut id. Atribut ini berfungsi sebagai identitas untuk elemen dan memungkinkan Anda untuk memprogram ke elemen dengan ID spesifik mereka. Selain atribut ini, elemen HTML harus mengandung runat = "server". Ini memberi tahu server pemrosesan bahwa tag diproses di server dan tidak dianggap sebagai elemen HTML tradisional.

Singkatnya, untuk mengaktifkan akses terprogram ke elemen HTML, tambahkan runat="server".

Pengembang Marius Žilėnas
sumber
2
Tidak menjawab pertanyaan, yang menanyakan mengapa runat = "server" wajib pada tag ASP.NET.
nhahtdh
3
@nhahtdh Jawabannya adalah: "untuk mengaktifkan akses terprogram ke elemen HTML". :)
Pengembang Marius Žilėnas
2
OP tahu apa arti tag dan apa fungsinya. Pertanyaannya adalah bertanya dalam hal desain bahasa - apa yang membuat perancang memutuskan bahwa bahkan tag ASP.NET perlu ditandai dengan runat = "server" untuk dijalankan di sisi server.
nhahtdh
@nhahtdh apa jawaban Anda?
Pengembang Marius Žilėnas
2
Saya tidak punya jawaban, tetapi jawaban teratas menjawab pertanyaan (benar atau tidak). Jawaban Anda tidak, dan itulah alasan komentar saya.
nhahtdh
3

Kecurigaan saya adalah bahwa itu ada hubungannya dengan bagaimana kontrol sisi server diidentifikasi selama pemrosesan. Daripada harus memeriksa setiap kontrol pada saat runtime dengan nama untuk menentukan apakah pemrosesan sisi server perlu dilakukan, ia melakukan seleksi pada representasi simpul internal dengan tag. Compiler memeriksa untuk memastikan bahwa semua kontrol yang memerlukan tag server memilikinya selama langkah validasi.

tvanfosson
sumber
2

Elemen HTML dalam file ASP.NET, secara default, diperlakukan sebagai teks. Untuk membuat elemen-elemen ini dapat diprogram, tambahkan runat="server"atribut ke elemen HTML. Atribut ini menunjukkan bahwa elemen tersebut harus diperlakukan sebagai kontrol server.

ShaileshDev
sumber
1

Itu ada di sana karena semua kontrol dalam ASP. NET mewarisi dari System.Web.UI.Control yang memiliki atribut "runat".

di kelas System.Web.UI.HTMLControl, atribut tidak diperlukan, namun, di kelas System.Web.UI.WebControl atribut diperlukan.

sunting: izinkan saya lebih spesifik. karena asp.net cukup abstrak dari HTML, kompiler memerlukan semacam arahan sehingga ia tahu bahwa tag tertentu perlu menjalankan sisi server. jika atribut itu tidak ada maka tidak akan tahu untuk memprosesnya di server terlebih dahulu. jika tidak ada maka diasumsikan itu adalah markup reguler dan meneruskannya ke klien.

Russ Bradberry
sumber
3
Jawaban Anda adalah pertanyaan yang dirumuskan kembali.
Pablo Fernandez
2
Jawaban saya hanya menyatakan bahwa atribut runat ada karena pewarisan. Saya minta maaf karena tidak jelas.
Russ Bradberry
3
Agak terlalu tinggi di tumpukan, saya khawatir, pertanyaan saya adalah mengenai mengapa itu ada di tempat pertama. Bagaimanapun, terima kasih
johnc
2
Sekali lagi, tidak benar-benar menjawab pertanyaan, tapi saya melihat apa yang Anda katakan
JohnC
1

Saya berpikir bahwa Microsoft dapat memperbaiki ambiguitas ini dengan membuat kompiler menambahkan atribut runat sebelum halaman tersebut dikompilasi, sesuatu seperti tipe-erasure yang dimiliki java dengan generik, alih-alih menghapus, bisa menulis runat = server di mana pun ia melihat asp: awalan untuk tag, sehingga pengembang tidak perlu khawatir tentang hal itu.

Stefan
sumber
1

Jika Anda menggunakannya pada tag html normal, itu berarti bahwa Anda dapat memanipulasinya secara program di event handler dll, misalnya mengubah href atau kelas tag anchor pada pemuatan halaman ... hanya lakukan itu jika Anda harus, karena vanilla html tag lebih cepat.

Sejauh kontrol pengguna dan kontrol server, tidak, mereka hanya tidak akan bekerja tanpanya, tanpa menggali bagian dalam preprocessor aspx, tidak bisa mengatakan dengan tepat mengapa, tetapi akan menebak bahwa untuk alasan yang mungkin bagus, mereka hanya menulis pengurai seperti itu, mencari hal-hal yang secara eksplisit ditandai sebagai "melakukan sesuatu".

Jika @JonSkeet ada di mana saja, ia mungkin akan dapat memberikan jawaban yang jauh lebih baik.

seanb
sumber
0

Saat mengirimkan data ke server Web ASP.NET, kontrol yang disebut Runat = "server" akan direpresentasikan sebagai objek Dot Net di Aplikasi Server. Anda dapat secara manual mengetik kode dalam kontrol HTML atau menggunakan opsi Run As Server dengan mengklik kanan pada tampilan desain. Kontrol ASP.NET akan secara otomatis mendapatkan atribut ini setelah Anda menyeretnya dari kotak alat di mana biasanya kontrol HTML tidak.

Carthi
sumber
0

Atribut yang cukup berlebihan, mengingat tag "asp" jelas merupakan elemen ASP dan harus cukup untuk mengidentifikasinya sebagai elemen yang dapat diakses sisi server.

Namun di tempat lain digunakan untuk meninggikan tag normal untuk digunakan dalam kode-belakang.

jelas kapten
sumber
0

Saya baru saja sampai pada kesimpulan ini dengan trial-and-error: runat = "server" diperlukan untuk mengakses elemen saat run-time di sisi server. Hapus, kompilasi ulang dan tonton apa yang terjadi.

Jánosi Zoltán János
sumber
-5

runat="Server" menunjukkan postback ke server akan terjadi untuk "kontrol" HTML.

Formulir Web digunakan postbackterus-menerus untuk memberi sinyal server untuk memproses acara kontrol halaman.

.NET MVChalaman JANGAN gunakan postback(kecuali formulir "submit"). MVCmengandalkan JQUERYuntuk mengelola halaman di sisi klien (sehingga melewati kebutuhan akan banyak postbackpesan ke server).

Jadi: .NETFormulir Web ... gunakan "runat"banyak atribut di markup halaman.

.NET MVCjarang menggunakan "runat"atribut di markup halaman.

Semoga ini bisa membantu menjelaskan mengapa runatperlu ...

pointcounterpoint
sumber
1
-1 Fakta yang tidak akurat dan tidak menjawab pertanyaan.
Cristian Diaconescu