ASP.NET 웹 양식에 Runat =“Server”속성이 필요한 이유는 무엇입니까?


205

runat="server"필수 속성 일 때 serverASP.NET에 대한 제한된 지식으로 사용할 수있는 유일한 옵션 인 모든 ASP.NET 컨트롤에 지정해야하는 이유는 무엇 입니까?이를 사용하지 않으면 오류가 발생합니까?

HTML 태그에서 선택적으로 사용할 수 있다는 것을 이해하고 있으며 클라이언트 / 서버 패러다임과 실제로 지정하는 것을 이해합니다.

컨트롤이 ASP.NET 컨트롤 인 경우에만 암시 될 수있는 중복 태그입니까, 아니면 근본적인 이유가 있습니까?


2
좀 더 명확히하기 위해이 질문에 동의합니다 .'asp : '(및 헤더에 지정한 다른 태그)가 구문 분석하기에 충분하지 않습니까? 또는 컨트롤이 INPUT으로 변환 된 후 runat이 히트되어 다른 HTML과 구별되지 않습니까? 나는 서버 제어 양식에있는 동안 runat가 충돌 할 것이라고 생각할 것입니다 ...
이상 종료

1
아마도 접두사 또는 이름 기반 일 수 있는 일종의 " 기본 속성 "구성 옵션을에 추가하는 Web.config것이 적절한 해결 방법입니다. 구문 분석 프로세스 동안 필요한 경우 기본 속성을 DOM에 삽입 할 수 있습니다. 나는 ... 이런 생각을 가진 거 놀이 해요
댄 Lugg

답변:


112

나는 항상 ASP.NET 태그와 HTML 태그를 혼합 할 수 있다는 것을 이해하기 위해 더 많은 것이 있다고 믿었습니다 .HTML 태그에는 옵션 여부가 있습니다 runat="server". 태그를 그대로두면 아무 문제가 없으며 컴파일러 오류가 발생합니다. 웹 언어에 대해 암시하는 것이 많을수록 신진 프로그래머가 들어 와서 배우기가 쉽지 않습니다. 태그 속성에 대해 자세하게 설명하는 것이 좋습니다.

이 대화는 자신과 Microsoft National Services의 Talbot Crowell 사이 의 Mike Schinkel의 블로그에서 이루어졌습니다. 관련 정보는 다음과 같습니다 (소스의 문법 오류로 인해 첫 번째 단락이 해석 됨).

[...] 그러나 중요성은 <runat="server">일관성과 확장성에 대한 것입니다.

개발자가 <asp: />ASP.NET 엔진이 무시하도록 일부 태그 (viz. ) 를 표시해야하는 경우 태그간에 네임 스페이스 충돌 및 향후 개선 사항이 발생할 수 있습니다. <runat="server">속성 을 요구함으로써 이것은 무시된다.

계속됩니다 :

<runat=client>모든 클라이언트 측 태그에 필요한 경우 구문 분석기는 모든 태그를 구문 분석하고 <runat=client>파트를 제거해야합니다 .

그는 계속한다:

현재 내 추측이 맞다면 파서는 runat=server속성 또는 " <%"접두사 또는 ssi " <!– #include... (...) 가있는 태그가 아닌 한 모든 텍스트 (태그 또는 태그 없음)를 무시합니다 . 또한 ASP.NET은 설계되었으므로 웹 디자이너 (foo.aspx)와 웹 개발자 (foo.aspx.vb)를 분리 할 수 ​​있도록 웹 디자이너는 자체 웹 디자이너 도구를 사용하여 ASP.NET에 대해 몰라도 HTML 및 클라이언트 쪽 JavaScript를 배치 할 수 있습니다. 특정 태그 또는 속성


59
그 이유가 무엇이든간에, 안전하게 <기본값> 태그가 될 수있는 모든 <asp :> 태그에 대해 PITA를 입력해야하는 것은 여전히 ​​PITA입니다.
belugabob

33

나는 보통 추측하는 것을 좋아하지 않지만, 나는 이것에 대해 갈 것입니다 ...

마이크로 소프트의 .NET 마케팅이 당일 (2001 년)에 다시 등장한 것을 기억한다면, .NET이 무엇인지 말하기 어려웠습니다. 서버입니까? 프로그래밍 플랫폼? 언어? 완전히 새로운 것? 광고가 주어지면 원하는대로 모호하게 나타납니다. 문제가 해결되었습니다.

따라서 제 생각에는 ASP.NET 코드가 .NET 런타임에 연결된 Internet Explorer의 사본에서 서버 측 또는 클라이언트 측 어디에서나 실행될 수 있다는 숨겨진 비전이 있다고 생각합니다. runat = "server"는 단지 흔적 일 뿐이며, 클라이언트 측에서는 절대로 생산에 사용되지 않기 때문에 남겨져 있습니다.

그 이상한 광고를 기억하십니까?

관련 : .NET 기록 이있는 Register의 기사 .


5
"이상한 광고"가있는 사이트로 연결되는 링크가 있습니까?
RandomWebGuy

예, 이상한 광고가 기억납니다. 한숨
catfood

13

페이지에 포함될 수있는 모든 컨트롤이 서버에서 실행 되어야 하는 것은 아닙니다 . 예를 들면 다음과 같습니다.

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

이것은 본질적으로 다음과 같습니다.

<asp:Button runat=server />

첫 번째 태그에서 runat = server 태그를 제거하면 브라우저에서 실행되는 표준 HTML 단추가 있습니다. 서버에서 특정 컨트롤을 실행하는 이유와 반대 이유가 있으며 ASP.NET이 포함하는 HTML 태그를 기반으로 원하는 것을 "가정"할 수있는 방법이 없습니다. <asp:XXX />컨트롤 제품군에 대해 runat = server를 "추론"하는 것이 가능할 수도 있지만 Microsoft는 마크 업 구문과 ASP.NET 엔진에 대한 해킹을 고려할 것입니다.


2
컨트롤이 서버에서 실행 중이면 Javascript를 사용하여 요소를 선택할 수 없다는 의미입니까? 예 : document.getElementsById ( "tvns : treeview");
Ciaran Gallagher

3
요소는 여전히 클라이언트의 DOM에 있으므로 javascript / jQuery를 사용하여 요소를 수정할 수 있습니다. 그러나 서버 렌더링 요소에 대한 작업은 까다로울 수 있으며, 특히 동적 컨트롤에서는 더욱 복잡합니다.
Dave Swersky

8

Microsoft Msdn 기사 The Forgotten Controls : HTML Server Controls 는 runat = "server"를 텍스트 상자 <input type="text">에 대한 예제와 함께 사용하여 설명 합니다.<input type="text" id="Textbox1" runat="server">

이렇게하면 웹 페이지가 작성되어 클라이언트로 전송되기 전에 서버의 HTML 요소에 프로그래밍 방식으로 액세스 할 수 있습니다. HTML 요소는 id 속성을 포함해야합니다. 이 속성은 요소의 ID로 사용되며 특정 ID로 요소에 프로그래밍 할 수 있습니다. 이 속성 외에도 HTML 요소는 runat = "server"를 포함해야합니다. 이는 처리 서버에게 태그가 서버에서 처리되고 기존 HTML 요소로 간주되지 않음을 알려줍니다.

즉, HTML 요소에 프로그래밍 방식으로 액세스 할 수있게하려면 추가 runat="server"하십시오.


2
ASP.NET 태그에서 runat = "server"가 필수 인 이유를 묻는 질문은 다루지 않습니다.
nhahtdh

3
@nhahtdh 답은 "HTML 요소에 프로그래밍 방식으로 액세스 할 수 있도록하는 것"입니다. :)
개발자 Marius Žilėnas

2
OP는 태그의 의미와 의미를 알고 있습니다. 언어 설계 측면에서 문제가 제기됩니다. 디자이너는 ASP.NET 태그조차도 서버 쪽에서 runat = "server"로 표시해야한다고 결정합니다.
nhahtdh

@nhahtdh 당신의 대답은 무엇입니까?
개발자 Marius Žilėnas

2
답변이 없지만 상단 답변이 해당 질문에 대한 답변입니다 (올바른지 여부). 당신의 대답은 그렇지 않습니다. 그것이 저의 의견의 이유입니다.
nhahtdh

3

처리 과정에서 서버 측 컨트롤을 식별하는 방법과 관련이 있다는 의혹이 있습니다. 서버 측 처리를 수행해야하는지 여부를 판별하기 위해 런타임시 모든 제어를 이름으로 확인하지 않고 태그로 내부 노드 표시를 선택합니다. 컴파일러는 유효성 검사 단계에서 서버 태그가 필요한 모든 컨트롤에 컨트롤이 있는지 확인합니다.


2

ASP.NET 파일의 HTML 요소는 기본적으로 텍스트로 처리됩니다. 이러한 요소를 프로그래밍 가능하게하려면 runat="server"HTML 요소에 속성을 추가하십시오 . 이 속성은 요소가 서버 제어로 처리되어야 함을 나타냅니다.


1

ASP .NET의 모든 컨트롤은 "runat"특성이있는 System.Web.UI.Control에서 상속하기 때문입니다.

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 속성을 추가 하여이 모호성을 해결할 수 있다고 생각합니다 .java가 제네릭에 대해 가지고있는 유형 삭제 항목과 같이 지우는 대신 runat = server를 작성할 수 있습니다. asp : 태그의 접두사이므로 개발자는 걱정할 필요가 없습니다.


1

일반 html 태그에서 사용하면 이벤트 처리기에서 프로그래밍 방식으로 조작 할 수 있음을 의미합니다 (예 : 페이지로드시 앵커 태그의 href 또는 클래스 변경). 필요한 경우에만 수행하십시오. 바닐라 html 태그 더 빨리 가십시오.

사용자 컨트롤과 서버 컨트롤에 관해서는 아닙니다. 아직 aspx 전 처리기의 내부를 탐구하지 않고는 작동하지 않을 것입니다. 왜 그런지 정확히 말할 수는 없지만 아마도 좋은 이유 때문에 추측했을 것입니다. 그런 식으로 파서를 사용하여 "뭔가"로 명시 적으로 표시된 것을 찾습니다.

@JonSkeet이 어디에나 있다면 훨씬 더 나은 답변을 제공 할 수있을 것입니다.


0

ASP.NET 웹 서버에 데이터를 제출할 때 Runat = "server"라고 언급 된 컨트롤은 서버 응용 프로그램에서 Dot Net 개체로 표시됩니다. HTML 컨트롤에 코드를 수동으로 입력하거나 디자인보기에서 마우스 오른쪽 단추를 클릭하여 서버로 실행 옵션을 사용할 수 있습니다. ASP.NET 컨트롤은 일반적으로 HTML 컨트롤이없는 도구 상자에서이 속성을 드래그하면이 속성을 자동으로 가져옵니다.


0

"asp"태그는 분명히 ASP 요소이며이를 서버 측 액세스 가능 요소로 식별하기에 충분해야합니다.

그러나 코드 비하인드에서 사용될 일반 태그를 높이는 데 사용되었습니다.


0

방금 시행 착오 로이 결론에 도달했습니다 : 서버 측의 런타임에 요소에 액세스하려면 runat = "server"가 필요합니다. 그것들을 제거하고 다시 컴파일하고 무슨 일이 일어나는지 지켜보십시오.


-5

runat="Server" HTML "제어"에 대해 서버로의 포스트 백이 발생 함을 나타냅니다.

Web Forms는 postback지속적으로 서버에 페이지 제어 이벤트를 처리하도록 신호를 보냅니다.

.NET MVC페이지는 사용하지 마십시오 postback(양식 제외 "submit"). 클라이언트 측에서 페이지를 관리하는 데 MVC의존합니다 JQUERY(따라서 postback서버에 많은 메시지가 필요하지 않음).

따라서 : .NETWeb Forms ... "runat"는 페이지 마크 업에서 속성을 많이 사용 합니다.

.NET MVC"runat"페이지 마크 업에서 속성을 거의 사용하지 않습니다 .

이것이 왜 runat필요한지 명확히하는 데 도움이되기를 바랍니다 ...


1
-1 부정확 한 사실이며 질문에 대답하지 않습니다.
Cristian Diaconescu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.