문제

이전에는 HTML과 Javascript로만 구성되었던 기존 애플리케이션을 일부 변경했습니다.서버 측 기능을 추가하기 위해 ASP.NET을 선택하고 마스터 페이지 개념을 활용했습니다.불행하게도 하나의 거대한 웹 양식에서는 컨트롤 ID가 모두 "ctl00$ContentBody$" 접두사로 인해 손상되었습니다.ID를 변경한 모든 INPUT 컨트롤에 runat="server"를 추가했습니다.이제 ID가 변경되었으므로 Javascript(너무 형편없어서 읽을 수도 없고 JS에 대한 경험도 풍부함)가 완전히 손상되었습니다.

그렇다면 이런 말도 안되는 내용이 HTML로 렌더링되는 것을 어떻게 방지할 수 있습니까?나는 어떻게든 HtmlGenericControl을 상속하는 클래스를 생성하고(웹 컨트롤을 사용하지 않고 모든 입력 태그에 runat="server"를 추가했습니다) 어떻게든 이 "컨테이너 ID"를 고정하는 논리를 재정의할 수 있기를 바랐습니다. ID 및 NAME 속성의 시작 부분입니다.그런 다음 web.config에서 tagMapping을 사용하여 전역 변경을 수행할 수 있습니다.이것이 가능한가?

도움이 되었습니까?

해결책 6

빠르고 더러운 것은 내가 필요로하는 것이 었습니다. 그리고 Hboss 덕분에 나는 매우 간단한 솔루션을 생각해 낼 수있었습니다. 문제의 페이지의 코드-홀드에 방금이 서브 루틴을 추가했습니다 ...

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    Dim Html As New StringWriter()
    Dim Render As New HtmlTextWriter(Html)
    MyBase.Render(Render)
    writer.Write(Html.ToString().Replace("name=""ctl00$ContentBody$", "name=""").Replace("id=""ctl00_ContentBody_", "id="""))
End Sub

다른 팁

지금은 작은 위안이지만이 "기능"은 ASP.NET 4.0에서 고정됩니다. 당신은 settable clientId 속성을 얻게됩니다.

그 외에는 다른 응답이 좋습니다.
< %= control.clientid %>를 사용하십시오

또는 jQuery를 던지고 $ ( [id $ = 'myid'])를 사용하십시오.

또는 입력 태그에서 런타임 = '서버'를 넣지 마십시오. 양식 멤버를 통해 값을 검색 할 수 있어야합니다 (전통적인 ASP에서와 같이)

또는 ASP.NET WebForms를 건너 뛰고 ASP.NET MVC로 건너 뛰면 생성 된 HTML 마크 업을 완전히 제어 할 수 있습니다. 당신은 당신이 일을 조금 더 일하는 방식을 바꿔야하지만, 그것은 당신에게 덜 실망 스러울 수 있습니다.

이 코드를 시도했는데 어떤 이유로 든 전체 페이지를 재구성합니다.

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    Dim Html As New StringWriter()
    Dim Render As New HtmlTextWriter(Html)
    MyBase.Render(Render)
    writer.Write(Html.ToString().Replace("name=""ctl00$ContentBody$", "name=""").Replace("id=""ctl00_ContentBody_", "id="""))
End Sub

예제를보고 싶다면 URL을 제출할 수 있습니다.

이름 지정 컨테이너를 컨트롤 ID로 선불로 제거하는 방법이 없다는 것을 알고 있습니다. 과거에는 편의 방법을 사용하여 태그 이름을 반복하고 끝나는 정규 표현식을 사용하는 JavaScript에서 이러한 ID를 찾아 보았습니다. $realID, 어디 realID 마크 업에서 제어에 준 ID입니다. 이제 다음과 같은 선택기를 사용하여 jQuery를 사용하겠습니다.

 $('[id$="realID"]')

기본적으로 기존 편의 방법과 같은 일을하지만 프레임 워크에 내장되어 있습니다.

내가 아는 한, 당신이 말한 바로 그 이유 때문에 그것들을 제거 할 방법이 없습니다. 그들이 독특하다고 보장합니다. 내가 보는 방식에는 두 가지 옵션이 있습니다.

  1. JS 변수를 만들고 올바른 ID를 찾도록 모든 JS 호출로 전제합니다.
  2. javaScript에서 < %= control.clientID %>를 사용하여 새 ID를 사용하십시오.

#1의 경우 입력이 다른 서버 태그 내에 있으면 작동하지 않습니다. 이것은 많은 문제가 발생하기 쉬우므로 가능하다면 #2로 갈 것입니다.

2는 페이지 자체에있는 JavaScript 또는 JS가 외부 인 경우 ID를 전달할 수 있어야합니다. 이 코드는 테스트되지 않았으며 예를 들어 만 사용되지만 다음은 다음과 같습니다.

function alertValue(textID){
     alert(document.GetElementById(textID).value);
}

<input id="txtBox" runat="server" type="Button" text="Click Me" onClick="alertValue('<%= txtBox.ClientID %>');" />

실제로 JS가 구현되는 방식에 따라 다릅니다.

최종 출력에서 ​​클라이언트 ID를 제거하려고 하는 것으로 나타나므로 페이지의 렌더링 이벤트를 재정의하고 정규식을 사용하여 제거할 수 있습니다.아래 포스팅에서 예시를 보실 수 있습니다.

ASP.NET 페이지 출력 다시 작성

작업 중인 텍스트를 얻은 후 다음과 같은 내용을 작성할 수 있습니다.

output = Regex.Replace(
    output, 
    @"id\=""ctl00\$[^\""]*""", 
    string.Empty, 
    RegexOptions.IgnoreCase
    );

그런 다음 최종 출력을 HtmlTextWriter에 씁니다.

도움이 되길 바랍니다.

이것을 확인하십시오 : http://clientidless.codeplex.com/ - ClientID를 거의 모든 컨트롤로 끌 수 있습니다. 다음은 데모입니다. http://show-demos.net/noclientid/ - "ID없이 렌더링"또는 "IDS가있는 렌더링"을 눌러 페이지 크기가 변경되는 방법을 확인하십시오. 차이점을 보려면 소스를보고.

이 두 센트를 추가하고 싶습니다.

나는 이런 식으로 (허용 된 답변에서) 이렇게했지만 렌더 컨트롤을 새로운 텍스트 작가에게 쓸 수있는 렌더 컨트롤을 무시하고 그 내용을 페이지의 내용을 씁니다. OutputStream 나에게 자원 낭비처럼 보인다. 나는 이것이 반복하기 위해 약간의 수업을 만들어서 할 수 있다고 말했다. HtmlTextWriter 수업. 이런 식으로 우리는 스트림에 직접 글을 씁니다. 텍스트가 속성으로 사용될 때만 텍스트를 교체하려고합니다.

public class CleanHtmlTextWriter : HtmlTextWriter
{
    private const string MASTER_PAGE_ID = "ctl00";
    private const string CONTENT_NAME = "MainContent";

    public CleanHtmlTextWriter(TextWriter writer)
        : base(writer)
    {
    }

    public override void WriteAttribute(string name, string value)
    {
        if (name == "name")
            value = value.Replace(CONTENT_NAME + "$", "").Replace(MASTER_PAGE_ID + "$", "");

        if (name == "id")
            value = value.Replace(CONTENT_NAME + "_", "").Replace(MASTER_PAGE_ID + "_", "");

        base.WriteAttribute(name, value);
    }
}

그런 다음 다음과 같이 사용할 수 있습니다.

protected override void Render(HtmlTextWriter writer)
{
    base.Render(new CleanHtmlTextWriter(writer));
}

실제로 Josh의 답변에 대해 피기를 되 찾으려면 아래의 첫 번째 솔루션은 다른 입력 제어 요소와 포스트 백이 올바르게 작동하지 않는 데 문제가되는 것을 발견했습니다. 따라서 빈 변경을하는 대신 아래 두 번째 솔루션을 선택하여 요소 이름이 아닌 JavaScript를 변경했습니다.

조쉬의 해결책:

코드-홀드 :

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
    StringWriter Html = new StringWriter();
    HtmlTextWriter Render = new HtmlTextWriter(Html);
    base.Render(Render);
    writer.Write(Html.ToString()
        .Replace("name=\"ctl00$ContentBody$", "name=\"")
        .Replace("id=\"ctl00_ContentBody_", "id=\""));
}

해결책 1, Postback 문제가 있습니다 (참고 :이 솔루션을 해결할 수있는 ID를 변경할 수 없었습니다).

코드-홀드 :

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
    var html = new StringWriter();
    var render = new HtmlTextWriter(html);
    base.Render(render);
    writer.Write(html.ToString()
        .Replace("name=\"ctl00$contentBody$rbl",
                 "name=\"ctl00_contentBody_rbl"));
}

해결책 2, JavaScript를 변경하려면 :

라디오 버튼이 나열된 컨벤션 'rbl [name]'을 사용하는 ASPX 파일의 JavaScript

if (!validateRadioButtonList("<% =rblTitle.ClientID %>"))

코드-홀드 :

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
    var html = new StringWriter();
    var render = new HtmlTextWriter(html);
    base.Render(render);
    writer.Write(html.ToString()
        .Replace("validateRadioButtonList(\"ctl00_contentBody_rbl", 
                 "validateRadioButtonList(\"ctl00$contentBody$rbl"));
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top