ASP.NET web formları neden Runat = “Sunucu” özelliğine ihtiyaç duyar?


205

runat="server"Zorunlu bir öznitelik olduğunda ve serversınırlı ASP.NET bilgimde kullanılabilen tek seçenek neden tüm ASP.NET denetimlerimde belirtmem gerekiyor ve kullanmıyorsam bir hata alıyorum?

İsteğe bağlı olarak HTML etiketlerimde kullanabileceğimi anlıyorum ve istemci / sunucu paradigmasını ve aslında ne belirlediğini anlıyorum.

ASP.NET denetimi olarak denetimin ima edebileceği gereksiz bir etiket mi, yoksa bunun altında yatan bir neden var mı?


2
Bu soruyu kabul ediyorum, biraz daha açıklığa kavuşturmak için, 'asp:' (ve başlıkta belirttiğiniz diğer etiketler) ayrıştırılmak için yeterli değil mi? veya kontrol bir INPUT'a dönüştürüldükten sonra diğer HTML'den ayırt edilemez hale getirildikten sonra runat vuruyor mu? Runat hala sunucu kontrol formunda iken vurulacaktı ...
12'de

1
Belki de önek veya isme dayalı olabilecek bir tür " varsayılan öznitelik " yapılandırma seçeneği eklemek Web.configuygun bir çözüm olacaktır. Ayrıştırma işlemi sırasında varsayılan öznitelikler gerektiğinde DOM'ye enjekte edilebilir. Bu fikirle oynayacağım ...
Dan Lugg

Yanıtlar:


112

ASP.NET etiketlerini ve HTML Etiketlerini karıştırabileceğiniz anlayışı için daha fazla olduğuna inanıyordum ve HTML Etiketleri ya olma runat="server"ya da olma seçeneğine sahip . Etiketi bırakmak için hiçbir şeye zarar vermez ve derleyicinin çıkartması için hataya neden olur. Web dili hakkında ne kadar çok şey ifade ederseniz, tomurcuklanan bir programcının gelip öğrenmesi o kadar kolay değildir. Bu, etiket nitelikleri hakkında ayrıntılı olmak için herhangi bir sebep kadar iyidir.

Bu konuşma Mike Schinkel'in üzerinde vardı Blog kendisi ve Microsoft Milli Hizmetleri Talbot Crowell arasında. İlgili bilgiler aşağıdadır (kaynaktaki dilbilgisi hataları nedeniyle ilk paragraf daha açıklanmıştır):

[...] ama önemi <runat="server">daha fazla tutarlılık ve genişletilebilirlik içindir.

Geliştiricinin <asp: />ASP.NET Engine uygulamasının yoksayması için bazı etiketleri (viz. ) İşaretlemesi gerekiyorsa, etiketler ve gelecekteki geliştirmeler arasında olası ad alanı çakışmaları sorunu da vardır. <runat="server">Özniteliği gerektirerek , bu reddedilir.

Devam eder:

Eğer <runat=client>tüm istemci tarafı etiketleri için gerekli olan, çözümleyici tüm etiketleri ayrıştırmak ve dışarı belirlenmesi gerekiyordu <runat=client>parçasını.

Diye devam ediyor:

Şu anda, tahminim doğruysa, ayrıştırıcı, runat=serverözniteliği olan bir etiket veya “ <%” öneki veya ssi “ <!– #include(...) olmadığı sürece tüm metni (etiketleri veya etiketleri yok) yok sayar. Ayrıca, ASP.NET tasarlandığından web tasarımcılarının (foo.aspx) web geliştiricilerinden (foo.aspx.vb) ayrılmasına izin vermek için, web tasarımcıları ASP.NET hakkında bilgi sahibi olmak zorunda kalmadan HTML ve istemci tarafı JavaScript'i yerleştirmek için kendi web tasarım araçlarını kullanabilirler. belirli etiketler veya özellikler.


59
Nedeni ne olursa olsun, varsayılan değer olabildiğince her <asp:> etiketi için yazmak zorunda olan bir PITA.
belugabob

33

Genellikle tahmin etmekten hoşlanmam ama bunu yapacağım ...

Microsoft'un .NET pazarlama hype'ı (2001?) Gününde hatırlarsanız, .NET'in ne olduğunu bile söylemek zordu. Sunucu muydu? bir programlama platformu? dil? tamamen yeni bir şey mi? Reklamlar göz önüne alındığında, belirsiz olmasını istediğiniz her şeydi - sadece sahip olabileceğiniz herhangi bir sorunu çözdü.

Yani, tahminim ASP.NET kodunun herhangi bir yerde çalışabileceği gizli bir büyük vizyon vardı - sunucu tarafı VEYA istemci tarafı, Internet Explorer'ın .NET çalışma zamanına bağlı bir kopyası. runat = "server" sadece geride kalan bir kalıntıdır, çünkü istemci tarafı eşdeğeri asla üretime geçememiştir.

Bu garip reklamları hatırlıyor musunuz?

İlgili: Bazı .NET geçmişi olan Register'dan Makale .


5
Herhangi bir "garip reklam" içeren bir siteye bağlantınız var mı?
RandomWebGuy

Evet garip reklamları hatırlıyorum.
çekiyor

13

Bir sayfaya dahil edilebilir tüm kumandaların Değil gerekir sunucuda çalıştırılabilir. Örneğin:

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

Bu aslında aşağıdakilerle aynıdır:

<asp:Button runat=server />

İlkinden runat = server etiketini kaldırın ve tarayıcıda çalışan standart bir HTML düğmesine sahipsiniz. Sunucuda belirli bir denetimin çalıştırılmasına karşı veya bunun nedenleri vardır ve ASP.NET'in, eklediğiniz HTML işaretlemesine dayalı olarak ne istediğinizi "varsayması" için bir yol yoktur. <asp:XXX />Denetimler ailesi için runat = sunucusunu "çıkarmak" mümkün olabilir , ama tahminim Microsoft'un işaretleme sözdizimi ve ASP.NET motoruna yönelik bir saldırı olduğunu düşünmesi.


2
Sunucuda bir kontrol çalışıyorsa, Javascript kullanarak öğeleri seçemeyeceğiniz anlamına mı geliyor? örneğin document.getElementsById ("tvns: treeview");
Ciaran Gallagher

3
Öğe hala istemcideki DOM'da olacaktır, bu nedenle javascript / jQuery kullanarak öğeyi değiştirmek hala mümkündür. Ancak, sunucu tarafından oluşturulan öğelerle çalışmak özellikle dinamik denetimlerde zor olabilir.
Dave Swersky

8

Microsoft Msdn makalesi Unutulmuş denetimler: HTML sunucu denetimleri runat = "sunucu" metin kutusuna örnek ile <input type="text">dönüştürerek açıklar<input type="text" id="Textbox1" runat="server">

Bunu yapmak, Web sayfası oluşturulmadan ve istemciye gönderilmeden önce sunucudaki HTML öğesine programlı erişim sağlar. HTML öğesi bir id niteliği içermelidir. Bu özellik, öğe için bir kimlik görevi görür ve öğelere belirli kimliklerine göre programlamanızı sağlar. Bu özelliğe ek olarak, HTML öğesinin runat = "sunucu" içermesi gerekir. Bu, işleme sunucusuna etiketin sunucuda işlendiğini ve geleneksel bir HTML öğesi olarak kabul edilmeyeceğini bildirir.

Kısacası, HTML öğesine programlı erişimi etkinleştirmek runat="server"için ona ekleyin .


2
ASP.NET etiketlerinde runat = "server" ın neden zorunlu olduğunu soran soruyu ele almaz.
nhahtdh

3
@nhahtdh Cevap: "HTML öğesine programlı erişimi etkinleştirmek için". :)
Geliştirici Marius Žilėnas

2
OP, etiketin ne anlama geldiğini ve ne yaptığını bilir. Soru, dil tasarımı açısından soruyor - tasarımcının ASP.NET etiketlerinin bile sunucu tarafında çalışması için runat = "server" ile işaretlenmesi gerektiğine karar vermesini sağlayan şey nedir?
nhahtdh

@nhahtdh Cevabın nedir?
Geliştirici Marius Žilėnas

2
Bir cevabım yok, ancak üst cevaplar soruyu ele alıyor (doğru ya da değil). Cevabınız cevap vermiyor ve yorumumun nedeni de bu.
nhahtdh

3

Benim şüphe, işlem sırasında sunucu tarafı denetimlerinin nasıl tanımlandığı ile ilgili olmasıdır. Sunucu tarafı işlemenin yapılması gerekip gerekmediğini belirlemek için çalışma zamanında her denetimi adıyla denetlemek yerine, iç düğüm gösteriminde etikete göre bir seçim yapar. Derleyici, doğrulama adımı sırasında sunucu etiketleri gerektiren tüm denetimlerin bunlara sahip olup olmadığını denetler.


2

ASP.NET dosyalarındaki HTML öğeleri varsayılan olarak metin olarak kabul edilir. Bu öğeleri programlanabilir hale getirmek runat="server"için HTML öğesine bir özellik ekleyin . Bu öznitelik, öğenin bir sunucu denetimi olarak ele alınması gerektiğini belirtir.


1

ASP .NET'teki tüm denetimlerin, "runat" özniteliğine sahip System.Web.UI.Control kaynağından devralması nedeniyle orada.

System.Web.UI.HTMLControl sınıfında öznitelik gerekli değildir, ancak System.Web.UI.WebControl sınıfında öznitelik gereklidir.

edit: daha spesifik olalım. asp.net hemen hemen bir HTML özeti olduğundan, derleyicinin belirli bir yönerge ihtiyacı vardır, böylece belirli etiketin sunucu tarafında çalışması gerekir. bu öznitelik olmasaydı, önce sunucuda işlemeyi bilemezdi. yoksa, düzenli biçimlendirme olduğunu varsayar ve istemciye iletir.


3
Cevabınız yeniden formüle edilen soru.
Pablo Fernandez

2
Benim cevabım, runat özelliğinin kalıtım nedeniyle orada olduğunu belirtmekti. Açık olmadığım için özür dilerim.
Russ Bradberry

3
Yığında biraz fazla yüksek, korkarım, sorum neden ilk başta orada olduğu ile ilgiliydi. Neyse
johnc

2
Yine, soruyu gerçekten cevaplamıyor, ama ne demeye çalıştığınızı görüyorum
johnc

1

Microsoft bu belirsizliği sayfa derlenmeden önce derleyici runat özniteliği ekleyerek düzeltebileceğini düşünüyorum, Java'nın jeneriklerle sahip olduğu tür silme olayı gibi bir şey silmek yerine runat = server yazıyor olabilir. asp: etiketler için önek olduğundan geliştiricinin bunun için endişelenmesine gerek kalmaz.


1

Normal html etiketlerinde kullanırsanız, bunları olay işleyicilerinde vb. Programlı olarak manipüle edebileceğiniz anlamına gelir, örn. Sayfa yüklemesinde href veya bağlantı etiketinin sınıfını değiştirin ... bunu yapmak zorundaysanız yapın, çünkü vanilya html etiketleri daha hızlı git.

Kullanıcı kontrolleri ve sunucu kontrolleri ile ilgili olarak, hayır, sadece aspx ön işlemcisinin iç kısımlarına girmeden, onlarsız çalışmayacaklar, tam olarak nedenini söyleyemediler, ancak muhtemelen iyi nedenlerle, sadece yazdıklarını tahmin edeceklerdi. ayrıştırıcı bu şekilde, açıkça "bir şey yap" olarak işaretlenmiş şeyleri arar.

@JonSkeet herhangi bir yerdeyse, muhtemelen çok daha iyi bir cevap verebilir.


0

ASP.NET Web sunucusuna veri gönderilirken Runat = “server” olarak belirtilen kontroller Sunucu Uygulamasında Dot Net nesneleri olarak gösterilecektir. Kodu HTML denetimlerinde el ile yazabilir veya tasarım görünümünde sağ tıklayarak Sunucu Olarak Çalıştır seçeneğini kullanabilirsiniz . ASP.NET denetimleri, genellikle HTML denetimlerinin olmadığı araç kutusundan sürüklediğinizde bu özniteliği otomatik olarak alır.


0

"Asp" etiketi dikkate alındığında oldukça gereksiz bir özellik, açıkça bir ASP elemanıdır ve bunu sunucu tarafından erişilebilir bir eleman olarak tanımlamak için yeterli olmalıdır.

Ancak başka yerlerde, arkadaki kodda kullanılacak normal etiketleri yükseltiyordu.


0

Ben sadece bu sonuca deneme yanılma yoluyla geldi: runat = "sunucu" sunucu tarafında çalışma zamanında öğelere erişmek için gereklidir. Onları kaldırın, yeniden derleyin ve neler olduğunu izleyin.


-5

runat="Server" HTML "kontrolü" için sunucuya bir geri dönüş olacağını belirtir.

Web Formları postback, sunucuya bir sayfa denetimi olayını işlemesi için sinyal vermek üzere sürekli olarak kullanır .

.NET MVCsayfalar KULLANMAYIN postback(form hariç "submit"). sayfayı müşteri tarafında yönetmeye MVCgüvenir JQUERY(böylece çok sayıdapostback sunucuya ileti ).

Yani: .NETWeb Formları ... "runat"sayfa biçimlendirmesinde çok fazla özellik kullanır .

.NET MVC neredeyse hiç kullanmaz "runat"sayfa biçimlendirmesinde özellik .

Umarım bunun neden runatgerekli olduğunu açıklığa kavuşturmasına yardımcı olur ...


1
-1 Yanlış gerçekler ve soruyu cevaplamıyor.
Cristian Diaconescu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.