'2017/02'에 해당되는 글 4건

Programming/.NET

컨트롤을 제작할때 설정에 관한 내용은 대부분 속성을 통해 정의됩니다. 속성은 특별한 과정을 거치지 않아도 속성타입에 대해 적절한 형변환이 이루어져 컨트롤을 디자인할때 속성창에 노출되고 개발자가 원하는 특정값을 속성창을 통해 설정할 수 있습니다.

 

하지만 형변환을 명시적으로 해주어야 하는 경우에 형변환은 TypeConverter 클래스를 사용합니다. 이 클래스는 속성값을 속성창에 보여줄때 string형으로 변환했다가 속성값이 입력되면 다시 해당 속성형식으로 변환해 값을 받아들일 수 있도록 합니다.

 

[Bindable(true)]
[Category("Appearance")]
[TypeConverter(typeof(ColorConverter))]
public Color FrontColor
{
    get;
    set;
}

 

위 예제는 색상을 설정할 수 있는 FrontColor라는 속성을 정의해 두고 TypeConverter특성을 통해 속성의 변환형태를 Color(ColorConverter)로 지정하였습니다. Converter(타입변환기)는 Color이외에 Int나 GUID등 다양한 형태로 존재하므로 원하는 타입변환기를 설정할 수 있습니다.

 

만약 정의한 속성이 커스텀화된 경우라면 단순한 타입변환기로는 구현이 불가능하므로 직접 형변환에 대한 로직을 구현해야 합니다.

 

public class FrontColor
{
    public FrontColor(Color color)
    {
        SetColor = color;
    }

    public Color SetColor
    {
        get;
        set;
    }
}

 

여기 FrontColor라는 클래스가 있습니다. 이 클래스에 맞는 형변환을 구현하려면 TypeConverter클래스로 부터 상속받은 새로운 클래스를 형변환클래스로 작성합니다.

 

public class FrontColorConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
            return true;

        return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string) {
            Color color = Color.FromName((string)value);
            return new FrontColor(color);
        }

        return base.ConvertFrom(context, culture, value);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(Color)) {
            return ((FrontColor)value).SetColor.Name;
        }

        return base.ConvertTo(context, culture, value, destinationType);
    }
}

 

위에서 작성된 CanConvertFrom메소드는 전달된 값이 실제 지정된 형으로 변환이 가능한지를 확인하는 용도이며 ConvertFrom은 string을 FrontColor타입으로 변환하고 ConvertTo는 FrontColor타입을 다시 string형으로 변환하는 역활을 수행함으로서 컨트롤의 속성값을 디자인타임에서 출력하거나 입력을 받아 적절히 처리할 수 있도록 합니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] 설정파일 - 2  (0) 2017.03.06
[ASP.NET] 서버 컨트롤 - 8 (디자인)  (0) 2017.03.03
[ASP.NET] 서버 컨트롤 - 7 (형변환)  (0) 2017.02.22
[ASP.NET] 서버 컨트롤 - 6 (컨트롤)  (0) 2017.02.08
[ASP.NET] HttpModule, HttpHandler  (0) 2017.02.02
[ASP.NET] AJAX  (0) 2017.01.24
0 0
OS/Windows

* 사용자 계정으로 root로 할때의 상황임.

 

1. vim 으로 root의 home 디렉토리에 있는 .bashrc 파일을 열어줍니다.

 

2. #force_color_prompt=yes 에서 주석처리(#문자)를 제거합니다.

 

3. 기존 PS1='${debian_chroot:+($debian_chroot)}~~~ 내용을 다음과 같이 바꿔줍니다.

 

붉은색으로 하고자 한다면 ->

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

 

연두색으로 하고자 한다면 ->

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

 

4. 수정된 .bashrc 파일을 저장하고 source ~/.bashrc 명령으로 변경사항을 적용시켜 주면 끝.

 

 

'OS > Windows' 카테고리의 다른 글

[Ubuntu bash] prompt 색상 변경  (0) 2017.02.14
[Ubuntu bash] 최신배포판 업데이트및 완전삭제  (0) 2016.11.09
0 0
Programming/.NET

서버 컨트롤안에서 RenderContents 메소드로 HTML을 렌더링을 통하여 특정 컨트롤을 생성하는 대신에 컨트롤을 직접 렌더링할 수도 있습니다.

 

public class WebCustomControl1 : CompositeControl

 

이를 위해 서버 컨트롤에서는 기존 WebControl 대신 CompositeControl 클래스로부터 상속받아야 합니다.

 

protected TextBox textbox = new TextBox();

protected override void CreateChildControls()
{
    this.Controls.Add(textbox);
}

 

예를 들어 TextBox 컨트롤을 생성하려면 해당 TextBox의 컨트롤 개체를 생성해 CreateChildControls 메소드를 재정의 하여 컨트롤을 추가하면 됩니다.

 

이것이 전부입니다. 기존의 RenderContents 메소드같은건 더이상 존재하지 않습니다.

 

다만 실제 위와같이 작성된 서버 컨트롤은 비록 TextBox와 같은 컨트롤을 포함하고 있다 하더라도 속성등을 통해 포함된 TextBox의 속성에는 접근할 수 없습니다. TextBox속성을 그대로 서버 컨트롤에서 구현하려면 원하는 속성을 직접 정의해 줘야 합니다.

 

protected override void CreateChildControls()
{
    this.Controls.Add(textbox);
    this.ChildControlsCreated = true;
}

 

먼저 해당 속성 구현을 위해 CreateChildControl 메소드에서 ChildControlsCreated 속성을 true로 설정합니다.

 

public string Text
{
    get {
        EnsureChildControls();
        return textbox.Text;
    }
    set {
        EnsureChildControls();
        textbox.Text = value;
    }
}

 

그 다음 속성을 구현하면 되는데 이때 사용된 EnsureChildControls() 메소드는 속성으로 접근될 해당 컨트롤이 실제 생성되어 있는지 여부를 판단합니다.

 

서버 컨트롤은 위에서 처럼 단순히 컨트롤 하나를 렌더링할 수 있지만 HTML요소를 포함하는 특정 템플릿 형식의 컨트롤을 표현할 수 있는 방안또한 제공하고 있습니다.

 

템플릿 컨트롤사용을 위해서는 우선 템플릿으로 활용할 컨트롤을 생성해야 합니다.

 

public class ContentBox : Label, INamingContainer
{
    public string message { get; internal set; }
}

 

ContentBox라는 컨트롤은 Label에서 상속받은 컨트롤이며 INamingContainer 인터페이스를 상속받습니다. 그리고 해당 컨트롤에서 특정 내용을 표시하기 위해 message라는 string형식의 속성하나를 두었습니다.

 

public class WebCustomControl1 : WebControl

 

템플릿 형식의 컨트롤 사용시에 서버 컨트롤은 WebControl로부터 상속받습니다.

 

[Browsable(false)]
public ContentBox lbl { get; internal set; }

 

이전에 생성한 ContentBox컨트롤의 개체를 생성하며 입력과 출력에 대한 속성을 설정합니다. 해당 개체는 직접 외부에 드러날 필요가 없으므로 Browsable특성을 false로 설정합니다.

 

[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(ContentBox))]
public virtual ITemplate lblTemplate { get; set; }

 

실제 화면에 표시하기 위한 템플릿을 생성합니다. 이 템플릿은 페이지 내부에서 속성으로 접근되며 ComtentBox형식으로 표현됩니다.

 

[Browsable(true)]
[DefaultValue("")]
public string message { get; set; }

 

컨트롤에서 설정가능한 속성을 추가합니다. 이 속성에서 설정한 값이 lblTemplate에 의해 표시될 것입니다.

 

public override void DataBind()
{
    EnsureChildControls();
    ChildControlsCreated = true;

    base.DataBind();
}

 

DataBind 메소드를 위와같이 재정의합니다. 페이지에서 DataBind함수가 호출되면 실제 템플릿이 설정된 속성으로 표시됩니다.

 

protected override void CreateChildControls()
{
    this.Controls.Clear();
    this.lbl = new ContentBox() { message = message };
    this.lblTemplate.InstantiateIn(this.lbl);

    Controls.Add(this.lbl);
}

 

CreateChildControls 메소드를 재정의 하여 템플릿이 컨트롤로 추가될수 있도록 구현합니다.

 

여기까지 서버 컨트롤을 작성하고 나면 이제 서버 컨트롤이 올라간 페이지에서 템플릿을 구현해야 합니다.

 

<cc1:WebCustomControl1 runat="server" ID="myControl" message="반갑습니다.">
    <lblTemplate>안녕하세요. <%# Container.message %></lblTemplate>
</cc1:WebCustomControl1>

 

서버 컨트롤에서 message 속성에 값을 입력하고 하위에 템플릿을 정의합니다. Container는 템플릿을 포함하고 있는 서버 컨트롤을 의미하며 서버 컨트롤의 message값을 받아 출력하도록 처리하고 있습니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] 서버 컨트롤 - 8 (디자인)  (0) 2017.03.03
[ASP.NET] 서버 컨트롤 - 7 (형변환)  (0) 2017.02.22
[ASP.NET] 서버 컨트롤 - 6 (컨트롤)  (0) 2017.02.08
[ASP.NET] HttpModule, HttpHandler  (0) 2017.02.02
[ASP.NET] AJAX  (0) 2017.01.24
[ASP.NET] 캐시 - 2  (0) 2017.01.17
0 0
Programming/.NET

클라이언트가 서버(ASP.NET)에 어떤 특정한 요청을 던져주는 경우 해당 요청은 최종 HTTP응답페이지를 생성하기 전에 여러 필요한 모듈을 거처 요청이 처리될 수 있는 과정을 거치게 됩니다. HttpModule은 HTTP요청이 처리되는 동안 ASP.NET에서 발생하는 이벤트를 활용하여 필요한 처리를 수행하도록 합니다.

 

HttpModule을 생성하려면 Visual Studio의 Add New Item대화상자에서 ASP.NET Module을 선택하면 됩니다.

 

 

페이지를 추가하고 나면 아래와 같은 코드를 볼 수 있습니다.

 

public void Init(HttpApplication context)
{
    // Below is an example of how you can handle LogRequest event and provide 
    // custom logging implementation for it
    context.LogRequest += new EventHandler(OnLogRequest);
}

 

Init 메소드를 Module의 시작점입니다. 여기에서 필요한 이벤트를 등록하고 프로그램 처리로직을 작성하게 됩니다. 아래는 Init에서 등록할 수 있는 이벤트내용입니다.

 

 AcquireRequestState

 세션상태를 가져오는 경우 발생

 AuthenticateRequest

 사용자 인증시 발생

 AuthorizeRequest

 사용자에게 권한을 부여하는 경우 발생

 BeginRequest

 신규 HTTP요청시 발생

 Disposed

 HTTP처리를 완료할때 발생

 EndRequest

 사용자에게 HTTP응답을 전송하기 직전에 발생

 Error

 제어되지 않은 예외발생시 발생

 PostRequestHandlerExecute

 HTTP처리기가 실행을 완료한 직후 발생

 PreRequestHandlerExecute

 HTTP요청의 이벤트 처리기를 실행하기 직전에 발생

 PreSendRequestContent

 사용자에게 HTTP응답 컨텐츠를 전송하기 직전에 발생

 PreSendRequestHeaders

 사용자에게 HTTP응답 헤더를 전송하기 직전에 발생

 

모듈을 테스트하기 위해 아래와 같이 모듈을 수정하도록 합니다.

 

HttpApplication httpApplication = null;
 /// <summary>
 /// You will need to configure this module in the Web.config file of your
 /// web and register it with IIS before being able to use it. For more information
 /// see the following link: http://go.microsoft.com/?linkid=8101007
 /// </summary>
 #region IHttpModule Members

 public void Dispose()
 {
     //clean-up code here.
 }

 public void Init(HttpApplication context)
 {
     httpApplication = context;
     // Below is an example of how you can handle LogRequest event and provide 
     // custom logging implementation for it
     context.LogRequest += new EventHandler(OnLogRequest);
     context.EndRequest += Context_EndRequest;
 }

 private void Context_EndRequest(object sender, EventArgs e)
 {

     httpApplication.Context.Response.Write("HI CLIEL!!");
 }

 #endregion

 public void OnLogRequest(Object source, EventArgs e)
 {
     //custom logging logic can go here
 }

 

Init 메소드에는 HttpApplication 개체가 전달되는데 모듈은 이 개체에 접근하여 요청이 처리되는 동안 특정 이벤트를 전달하여 필요한 처리를 수행하게 됩니다. 예제에서는 EndRequest 이벤트를 등록하여 사용자에게 HTTP응답 컨텐츠가 전송되기 직전 "HI CLIEL!!"이라는 문자열을 생성하여 응답 컨텐츠에 포함시켜 결과를 전송하도록 하였습니다.

 

모듈을 작성하고 나면 해당 모듈을 web.config에 아래와 같이 등록하여 요청이 해당 모듈을 거칠 수 있도록 해야 합니다.

 

<system.webServer>
  <modules>
    <add name="MyModule" type="web_form_test.MyModule" />
  </modules>
</system.webServer>

 

이렇게 하면 모든 요청이 MyModule 모듈을 거치게 되고 응답으로 되돌아 오는 결과마다 "HI CLIEL!!"이라는 문구가 추가되어 반환될 것입니다.

 

HttpHandler는 HttpModule과 달리 최종 결과를 위한 것입니다. 그래서 Handler는 특정 확장자를 가진 페이지내부에서 특정 결과를 만들어 내는데 사용됩니다.

 

Visual Studio에서 HttpHandler를 등록하려면 Add New Item대화상자에서 Generic Handler를 선택합니다. 제네릭 처리기(Generic Handler)는 기본 확장자가 ashx입니다.

 

 

아래는 기본적으로 생성된 Generic Handler의 내용입니다.

 

public class Handler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        context.Response.Write("Hello World");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

 

보시는 바와같이 Handler는 IHttpHandler 인터페이스를 구현하고 있고 이에 필요한 ProcessRequest메소드와 IsReusable속성을 가지고 있습니다.

 

ProcessRequest메소드는 요청으로 들어오는 HTTP요청을 직접적으로 처리하는 메소드로서 기본적으로 결과 컨텐츠를 text/plain 형으로 변경하고 Hello World를 출력하도록 되어 있으며 IsReusable속성은 HttpHandler 개체의 재사용여부를 설정하는 속성입니다.

 

이 handler에 대한 ashx페이지를 추가하고 브라우저에서 호출하면 Hellw World라는 문자열이 출력됨을 확인할 수 있습니다. ashx를 설명할때 가장 많이 사용하는 예제가 이미지 출력인데 여기서도 이미지 출력에 대한 예를 살펴보도록 하겠습니다.

 

프로젝트에 임의의 이미지파일을 하나 추가하고 다음과 같이 handler의 코드를 수정합니다.

 

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "image/jpeg";
    context.Response.WriteFile("21471517501_555eb3653a_o.jpg");
}

 

요청을 image/jpeg로 바꾸고 해당 이미지를 출력하도록 하였습니다. 이건 다음과 같이 특정 페이지에 삽입되어 원하는 이미지를 출력하는 용도로도 사용될 수 있습니다.

 

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <img src="Handler.ashx" alt="이미지" />
    </div>
    </form>
</body>
</html>

 

필요하다면 Handler.ashx?param=123 처럼 특정 쿼리스트링을 통해서 동적으로 출력되는 이미지를 조정하는 것도 가능할 것입니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] 서버 컨트롤 - 7 (형변환)  (0) 2017.02.22
[ASP.NET] 서버 컨트롤 - 6 (컨트롤)  (0) 2017.02.08
[ASP.NET] HttpModule, HttpHandler  (0) 2017.02.02
[ASP.NET] AJAX  (0) 2017.01.24
[ASP.NET] 캐시 - 2  (0) 2017.01.17
[ASP.NET] ExecuteXmlReader  (0) 2017.01.13
0 0
1
블로그 이미지

클리엘