Visual Studio 2008 Team Explorer에서 Team Foundation Server 2010에 연결하기

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (3/29/2011 4:15:02 PM) Viewing : 2978

흠..개고생 했습니다..ㅡ.ㅡ;

일단 저의 경우는 먼저 VS 2008을 설치 했습니다.

그 이후에 VS 2008 SP1을 설치 했습니다.

마지막으로 VS 2008 Team Explorer 을 설치 했습니다.

여기서 TFS 2010 서버에 연결 하기 위해서는  호환성 업데이트를 해야 합니다.

http://www.microsoft.com/downloads/ko-kr/details.aspx?FamilyID=cf13ea45-d17b-4edc-8e6c-6c5b208ec54d

 

넵..여기까지는 저도 알고 있습니다..ㅡ.ㅠ;

그런데 이 호환성 업데이트를 설치 하게 되면...이전 설치되어야 하는 것이 없기에..(???) 설치를 진행 할 수 없다고 합니다.(뭐 대략 이런 뉘앙스의 경고입니다..-- 기억이 안나서..ㅡ.ㅡ;)

필요 요구 사항은 VS2008 SP1 이며..앞서 말했듯이 전 이미 이것을 설치 했기에...

여기서부터 삽질의 시작입니다..끌끌끌.....

결과적으로 봤을때

http://software.intel.com/en-us/blogs/2009/06/10/connecting-visual-studio-2008-team-explorer-to-team-foundation-server-2010/

이 글의 도움을 받았습니다.

뭐 아티클은 저도 아는 정도인데..답글중에 제가 필요한 정보가 있더군요..

간단합니다..

서비스팩을 다시 인스톨 하는 것이었습니다..ㅡ.ㅠ;

그래서 이후 작업에는...

 

VS 2008 SP1을 설치 하고 호환성 업데이트를 설치 하고..

팀탐색기에서 Full URL을 입력하면...연결 성공..

 

흑흑... 이리 간단한 것을..ㅡ.ㅡ;;;


마지막 업데이트 : (3/29/2011 4:15:57 PM)

TAG : TFS Team Explorer 



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

asp.net MVC 에서 더욱 강력한 validation 도우미 xVal - 02

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (3/24/2011 4:28:25 PM) Viewing : 2934

xVal의 두번째 시간입니다..

이전 글에 소개했던 사이트들은 다 댕겨와 보셨겠지요..?

이제 설치 법을 알아 보도록 하겠습니다.

먼저 xVal.dll 을 첨부 하시고

스크립트에서 jquery 최신버전, jquery.validate.js가 미리 포함되어 있어야 하고..xVal.jquery.validate.js 가 필요합니다.

결론적으로는 xVal.dll과 xVal.jquery.validate.js 가 필요한것이죠.

 

[Model]

모델에서는 유효성 검사를 하기 위한 어트리뷰트를 표현합니다.

[SamePasswordAttirbute(FirstPropertyName = "Password", SecondPropertyName = "ConfirmPassword", ErrorMessage = "비밀번호와 비밀번호 확인의 값이 다릅니다.")]
public class Register
{
    [Required(ErrorMessage = "사용자 아이디를 입력하여 주십시오.")]
    [MaxMinStringLength(16, 4, ErrorMessage = "사용자 아이디의 글자수는 {0}보다 크고 {1}보다 작아야 합니다.")]
    [AlphaNumeric(IsAllowedFirstDigit = false, ErrorMessage = "사용자 아이디는 영문자 혹은 숫자로만 구성되어야 하며 첫 글자는 영문자여야 합니다.")]
    [DisplayName("사용자 아이디")]
    public string UserName { get; set; }
}

위 예제에서 클래스에 설정된 특성과 메서드에 설정된 특성을 볼 수 있습니다.

DisplayName 이라는 특성을 제외하고는 모두 유효성 검증 특성이 되겠습니다.

System.ComponentModel.DataAnnotations 라는 네임스페이스를 using 해주어야 하며 사용자 정의 특성도 있습니다.

사용자 정의 특성에 대해서는 다음 글에서 알아 보도록 하겠습니다.

 

[Controller]

컨트롤러에서는 유효성 검증 여부를 판단하는 코드가 들어 갑니다.

public ActionResult Register(Register model)
{
    if (this.ModelState.IsValid)
    {
        if (CaptchaHelper.VerifyAndExpireSolution(this.HttpContext, model.Captcha, model.Attempt)
        {
            //Other Actoin........
        }
        else
        {
            this.ModelState.AddModelError("authmessage", "캡챠의 텍스트가 다릅니다.");
        }
    }
    return this.CreateJson(false, model, "Error");
}

3행의 ModelState.IsValid 라는 속성이 그러한 예입니다.

이는 서버측의 유효성 검사가 되겠습니다.

코드 상에 추가로 유효성 검사를 하게 되는 경우 예외가 발생된다면 11행 처럼 ModelState.AddModelError 메서드로 예외 내용을 추가 하면 됩니다.

그리고 ActionResult를 리턴합니다.

 

[View]

이제 서버쪽의 유효성 검사는 되었습니다.남은건 클라이언트 영역의 유효성 검사가 남았군요.

클라이언트의 유효성 검사를 하기 위해서는 단 한줄의 코드가 필요합니다.

<%= this.Html.ClientSideValidation<Register>().UseValidationSummary("errorSummary")%>

ClientSideValidation메서드는 클라이언트측 유효성 검사를 하기위한 필수 메서드입니다. Register 라는 Model 에 대한 유효성 검사를 한다는 의미가 되겠습니다.

UseValidationSummary() 메서드는 이 유효성 검사의 예외 결과를 errorSummary 라는 개체의 innerHtml로 서머리를 하겠다는 의미입니다.

이 메서드를 생략하게 되면 이 사이트의 회원가입폼 처럼 유효성 검사 결과가 해당 컨트롤의 바로 옆에 출력이 되게 됩니다.

그에 반해 이 메서드를 사용하게 되면 errorSummary(보통 div가 되겠지요.)에 메시지를 뿌려주게 되지요..

<div id="errorSummary" style="display: none; z-index: 999;">
    <%= this.Html.ValidationSummary() %>
</div>

이런 식으로 선언을 하면 됩니다.

 

이렇게 설정을 하면 준비가 다 된것이죠.

이렇게 만들어진 페이지에서 소스보기를 하시면..

xVal.AttachValidator(null, {"Fields":[{"FieldName":"UserName","FieldRules":[{"RuleName":"Required","RuleParameters":{},"Message":"사용자 아이디를 입력하여 주십시오."},{"RuleName":"Custom","RuleParameters":{"Function":"validateAlphaNumeric","Parameters":"{\"IsAllowedFirstDigit\":false,\"MinRequiredAlphaCharacters\":0,\"MinRequiredNumericCharacters\":0}"},"Message":"사용자 아이디는 영문자 혹은 숫자로만 구성되어야 하며 첫 글자는 영문자여야 합니다."},{"RuleName":"Custom","RuleParameters":{"Function":"validateMaxMinStringLength","Parameters":"{\"MinLength\":4,\"MaxLength\":16}"},"Message":"사용자 아이디의 글자수는 4보다 크고 16보다 작아야 합니다."}]},{"FieldName":"RealName","FieldRules":[{"RuleName":"Required","RuleParameters":{},"Message":"이름을 입력하여 주십시오."}]},{"FieldName":"Email","FieldRules":[{"RuleName":"DataType","RuleParameters":{"Type":"EmailAddress"},"Message":"유효한 전자메일 주소 형식이 아닙니다."},{"RuleName":"Required","RuleParameters":{},"Message":"전자메일 주소를 입력하여 주십시오."}]},{"FieldName":"Password","FieldRules":[{"RuleName":"Required","RuleParameters":{},"Message":"비밀번호를 입력하여 주십시오."},{"RuleName":"Custom","RuleParameters":{"Function":"validateMaxMinStringLength","Parameters":"{\"MinLength\":4,\"MaxLength\":16}"},"Message":"비밀번호의 글자수는 4보다 크고 16보다 작아야 합니다."}]},{"FieldName":"ConfirmPassword","FieldRules":[{"RuleName":"Required","RuleParameters":{},"Message":"비밀번호 확인을 입력하여 주십시오."},{"RuleName":"Custom","RuleParameters":{"Function":"validateMaxMinStringLength","Parameters":"{\"MinLength\":4,\"MaxLength\":16}"},"Message":"비밀번호의 글자수는 4보다 크고 16보다 작아야 합니다."},{"RuleName":"Custom","RuleParameters":{"Function":"validateSamePassword","Parameters":"{\"FirstPropertyName\":\"Password\",\"SecondPropertyName\":\"ConfirmPassword\"}"},"Message":"비밀번호와 비밀번호 확인의 값이 다릅니다."}]},{"FieldName":"PasswordQuestion","FieldRules":[{"RuleName":"Required","RuleParameters":{},"Message":"비밀번호 찾기의 질문을 입력하여 주십시오."}]},{"FieldName":"PasswordAnswer","FieldRules":[{"RuleName":"Required","RuleParameters":{},"Message":"비밀번호 찾기의 대답을 입력하여 주십시오."},{"RuleName":"Custom","RuleParameters":{"Function":"validateMaxMinStringLength","Parameters":"{\"MinLength\":4,\"MaxLength\":16}"},"Message":"비밀번호 찾기 질문의 대답의 글자수는 4보다 크고 16보다 작아야 합니다."}]},{"FieldName":"UserSite","FieldRules":[{"RuleName":"RegEx","RuleParameters":{"Pattern":"(http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&amp;:/~\\+#]*[\\w\\-\\@?^=%&amp;/~\\+#])?","Options":"i"},"Message":"유효한 도메인 형식이 아닙니다."}]},{"FieldName":"Attempt","FieldRules":[{"RuleName":"Required","RuleParameters":{},"Message":"캡챠를 보고 올바른 텍스트를 입력하여 주십시오."}]}]}, {})

 

이런 코드가 생성되어 있습니다.

이는 xVal.jquery.validate.js 에 있는 메서드가 되겠습니다. 이 코드를 읽어서 클라이언트측 유효성 검사를 하게 되는 것이죠.

 

이로써 간단한 적용법을 알아 보았습니다.

다음글에서는 사용자 정의 특성을 만들어 보도록 하겠습니다.


마지막 업데이트 : (3/24/2011 4:28:25 PM)

TAG : validation MVC jquery xVal 



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

프로그램에서 엑셀(Excel)을 다루어 보자.(5)

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (3/22/2011 4:19:15 PM) Viewing : 3999

한동안 문제 없이 잘 사용하던 컴포넌트가 문제가 생겼습니다.

저는 아직 VS2008을 사용하고 있어서 몰랐었는데 오늘 팀원(연X정 씨)이 문제 제기를 해와서 살펴 보았습니다.

이전 설명에서도 언급했듯이 apach.poi 라는 어셈블리는 자바 기반입니다.

.net 에서는 j# 으로 컴파일되어 있어서 이를 구동하기 위해서는 j# 재배포 패키지가 필요합니다.

그런데.....

VS 2010에서는 CLR 구조가 바뀌어서...아님..ms에서 j#은 버린건지도 모르겠습니다만...문제가 생깁니다.

vjsnativ.dll 라는 어셈블리를 찾을 수 없다는 메시지를 던집니다.

넵..이런 오류가 되겠습니다.

 

열심히 구글링 해보았습니다.

저와 같은 문제를 가지고 있는 많은 개발자들의 글을 볼 수 있었고 trick 이지만..이에 대한 해결책을 제시한 글을 보았습니다.

http://blogs.windwardreports.com/davidt/2011/02/calling-j-code-from-net-40.html

별거 없습니다.

동적으로 해당 경로의 dll을 읽어 오는게 되겠습니다.

/// 
/// 어셈블리를 가져옵니다.
/// 
/// Name of the lp file.
/// 
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr LoadLibrary(string lpFileName);

이는 WIN32 API를 PInvoke로 설정한 메서드입니다.

이제 이 메서드를 이용하여 호출합니다.

/// <summary>
/// <para><see cref="ExcelHandler"/>의 정석 생성자입니다.</para>
/// <para>.NET Framework 4.0 이상에서는 J# 불러 올 수 없습니다.</para>
/// <para>아래 코드는 win32 API를 이용하여 직접 어셈블리를 읽어 오는 코드입니다.</para>
/// <para>반드시 J# 재배포 패키지 2.0 이 설치되어 있어야 합니다..</para>
/// </summary>
/// <remarks></remarks>
static ExcelHandler()
{
    if (Environment.Version.Major >= 4)
    {
        string folder = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), @"..\Microsoft.NET\Framework\v2.0.50727");
        folder = System.IO.Path.GetFullPath(folder);
        LoadLibrary(System.IO.Path.Combine(folder, "vjsnativ.dll"));
    }
}

위에서 보듯이 정적 생성자에 정의 하였습니다..

한번만 불러 오면 되기 때문이겠죠..

76 행을 보게 되면 버전 체크를 합니다.Major 버전이 4 이상이면 즉 닷넷 프레임워크의 버전이 4 이상이면 아래 루틴을 타겠지요..

^^;;

 

저도 이제 슬슬 VS2010으로 가봐야 할 때가 온거 같기도 하네요..ㅡ.ㅡ;;;


마지막 업데이트 : (3/22/2011 4:26:13 PM)




첨부 파일 보기 (1)
Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

asp.net MVC 에서 더욱 강력한 validation 도우미 xVal - 01

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (3/3/2011 4:48:19 PM) Viewing : 2893

웹에서 유효성 검사하는 방법은 여러가지가 있습니다.

원칙적으로 유효성 검사는 클라이언트측 유효성 검사와 서버측 유효성 검사를 같이 해주어야 합니다.

전통적인 개발방법에 의하면 클라이언트츠 유효성 검사는 javascript 를 이용하여 하게 됩니다.

예를 들면 필수 입력값이라든지 메일 형식이라든지...글자수 라든지...말이죠..

이와 똑같은 작업을 서버측에서도 해주어야 합니다..-기본이죠..^^;

이는 상당히 많은 코드를 타이핑 해야 합니다. 아주 지겨운 작업이죠.

jquery가 보편화 되면서 많은 클라이언트측 유효성 검사를 도와주는 플러그인들이 개발되었습니다.

여러 종류가 있겠지만..

제가 사용해 본것은 딱 2개입니다.

http://docs.jquery.com/Plugins/validation

http://plugins.jquery.com/project/validity

아마도 앞에 소개한 validation 이라는 플러그인은 너무나 유명해서..이미 사용중이신 분들도 있을꺼라 생각 됩니다.

그러나 validation 이라는 플러그인은 form 기반 유효성 검사기입니다.

다중폼 페이지에서는 상당히 유용하지만 단일폼에서는 상당히 까탈 스럽습니다.

기본적으로 web application 은 단일 폼입니다...아시죵???

단일페이지에서 하나의 폼에서 여러개의 action을 가진 submit 이 존재한다면(대부분의 .net web application이 이러한 구조죠..) 이 validation 이라는 플러그인은 무용지물이 되게 됩니다.

그래서 선택한 것이 바로 validity 라는 유효성 검사기입니다.

이 validity  플러그인은 element 기반 유효성 검사기입니다.(validation 에서도 element 기반으로 사용할 수 있겠더군요..js 파일을 까보니...내부적으로는 그렇게 사용하고 있었네요..)

element 기반 유효성 검사기라는 얘기는 개발자가 필요한 element에 대해서만 유효성 검사를 하겠다는 걸 의미합니다 submit과는 전혀 무관하게 말이죠..

실제로 상당히 유용하고 잘 썼습니다.

그러나....

asp.net MVC에 이르러서는 다중폼이...대세가 되었습니다. - 고전적인 asp로의 회귀 일지도 모르겠지만...

이는 다시 말해 validation 플러그인을 사용할 수가 있게 되었다는 얘기가 되겠네요.

자..만세........

이제 클라이언트측 유효성 검사는 대폭적으로 코드량을 줄일수가 있게 되었습니다만...

서버측 유효성 검사는 어떻게 합니까....????

이를 불편하게 느낀 개발자 몇몇은..실제로 하나의 모듈로서 서버측과 클라이언트측의 유효성 검사를 할수는 없는 것일까..하고 고민하게 되고..

그 결과물이 바로 소개해 드릴 xVal 입니다...

헉헉....서론이 엄청 길었네요..ㅡ.ㅡ;;;;

일단 http://xval.codeplex.com/ 에서 다운로드 받을 수 있지만..많은 내용은  개발자의 블로그에 많이 있네요.

http://blog.stevensanderson.com/category/xval/ 입니다.

이 샌더슨이라는 사람은 바로...asp.net MVC2 Framework 라는 책을 저술하신 분이죠..

우리나라에도 번역서가 나온지 한참되었으며..저도 사 보았습니다..ㅡ.ㅡ;;;

물론..짐작하시겠지만...ㅋㅋㅋ 그 책에서도 xVal을 소개 합니다. 단 몇 페이지 뿐이지만 개발하게된 동기 ... 정도는 나오고 기본 사용법도 나옵니다.

^^;

codeplex 에는 mvc 1.0을 위해서 개발되었다고 하였지만...2.0 하고도 완벽 호환 됩니다..저도 아주 즐겨 쓰고 있으며 당연히 이 사이트에도 적용되어 있습니다.

3.0은...모르겠네요..ㅎㅎㅎ

간략히 살펴 보실 분들은 위 블로그를 방문 하셔도 좋습니다.

소개는 이정도로 하고..다음 글 부터는 간단한 사용법...부터 시작하여...사용자 정의 유효성 검사 클래스를 만드는 법에서 스크립트 수정 사항까지...하나씩 살펴 보도록 하겠습니다.


마지막 업데이트 : (3/3/2011 4:48:19 PM)

TAG : validation MVC jquery xVal 



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

jquery로 treeview 만들기

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (2/12/2011 5:01:41 PM) Viewing : 8030

트리는 아마도 많이 필요할 거라 생각 됩니다.

asp.net에 트리 컨트롤이 있긴 하지만 서버 컨트롤이라 내키지 않지요. 쓰는 사람이 있을려나요....

컨셉은 다음과 같습니다.

데이터가 상당히 많다고 가정을 할때 처음 페이지를 로딩할때 전체 데이터를 가져오지는 않습니다.

최상단(root)의 데이터만 가져옵니다.

그리고 각각의 node를 클릭하면 ajax를 이용하여 json 형식으로 데이터를 db에서 조회 하여 동적으로 가지 (branches)를 바인딩 합니다.

한번 서버에서 조회하여 가져온 데이터는 클라이언트에 저장이 되어 다시 노드를 확장하게 되면 서버를 조회하지 않습니다. 즉 라운드트립이 발생하지 않습니다.

데이터가 상당히 많을 경우는 아마도...이러한 컨셉으로 가지 않을까 생각합니다.

 

jquery를 이용해서 트리를 생성하기 위해서는 트리뷰 플러그인을 이용합니다.

http://jquery.bassistance.de/treeview/demo/

아주 잘 만들어진 트리뷰입니다.

이거 그냥 쓰면 되지 않느냐..하는데...약간 문제가 있습니다.

노드의 앞이나 뒤에 이미지나 기타 컨트롤을 넣게 되면 이게...문제가 생깁니다.

그래서 약간 손을 봤습니다.

jquery.treeview.js의 67라인을 보게 되면..

// TODO use event delegation
this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview", function(event) {
    // don't handle click events on children, eg. checkboxes
    // if(this == event.target)
    //이방은 수정 - 체크 박스나 라이오 같은 컨트롤의 이벤트는 막지만 span이나 image의 이벤트는 통과 하여야 한다.                
    if (this == event.currentTarget && event.target.tagName != 'INPUT')
        toggler.apply($(this).next());
}).add($("a", this)).hoverClass();

요롷게 수정하였습니다.

input 컨트롤은 해당 노드 클릭 이벤트를 받지 않습니다. target을 currentTarget으로 바꾼 이유는 노드에 이미지를 넣을 경우 문제를 해결 하기 위해서입니다.

<ul class="filetree treeview">
    <li><span class="folder"><span class="image1">Folder 1<img src="images/file.gif" class="image2" /></span></span>
        <ul>
            <li><span class="folder">확장 폴더</span>
                <ul id="folder21">
                    <!--  <li><span class="file">Item 1.1.1</span></li>-->
                </ul>
            </li>
            <li><span class="folder">Folder 2</span>
                <ul>
                    <li><span class="folder">Subfolder 2.1</span>
                        <ul>
                            <li><span class="file">File 2.1.1</span></li>
                            <li><span class="file">File 2.1.2</span></li>
                        </ul>
                    </li>
                    <li><span class="folder">Subfolder 2.2</span>
                        <ul>
                            <li><span class="file">File 2.2.1</span></li>
                            <li><span class="file">File 2.2.2</span></li>
                        </ul>
                    </li>
                </ul>
            </li>
            <li><span class="folder">Folder 3</span>
                <ul>
                    <li><span class="file">File 3.1</span></li>
                </ul>
            </li>
            <li><span class="file">File 4</span></li>
        </ul>
    </li>
</ul>

일반적으로 18행의 경우와 같이 형식이 됩니다. 

이미지는 바로 이 span에 스타일로 bg이미지가 들어가 있는 형석입니다. css를 보면 확인 가능 하겠지요.

.filetree li { padding: 3px 0 2px 16px; }
.filetree span.folder, .filetree span.file { padding: 0px 0px 0px 17px; display: block; }
.filetree span.folder { background: url(../images/folder.gif) 0 0 no-repeat; }
.filetree li.expandable span.folder { background: url(../images/folder-closed.gif) 0 0 no-repeat; }
.filetree span.file { background: url(../images/icon_person.gif) 0 0 no-repeat; }

.filetree span.image1 { padding: 0px 0px 0px 17px; display: block; background: url(../images/icon_room.gif) 0 0 no-repeat; }

52행 부터 54행까지 보게 되면 bg 이미지로 되어 있는걸 확인 할 수 있습니다.

여기에 이미지를 추가 하기 위해서는 앞 html 코드의 16행 처럼 태그 안에 또 하나의 태그를 삽입하면 되겠습니다.

노드의 텍스트 뒷부분에 추가하기 위해서는 역시 16행 처럼 추가 하면 되겠지요.

샘플을 첨부합니다.

 


추가...사항입니다.

2번째 예제의 16행의 input 태그를 사용하게 되면 실상은 스타일이 약간 깨지게 됩니다.

이유는 앞에 있는 bg 이미지의 경우 span이 높이 16px 의 백그라운드로 지정이 되어서 이미지 자체가 16px를 모두 차지하고 있지만. 뒤에 붙게 되면 이 이미지는 span 내부에 위치하기 되에 스타일에 있는 padding에 의해 이미지가 아래로 내려 가게 됩니다.

input 같은 경우에는 실제 영역이 16px 이상이므로 이미지가 깨지게 됩니다. 

이미지가 오는 경우에도 마찬가지 입니다.

이미지가 높이 16px 이미지라면 설정된 span 영역 16px 보다 2픽셀 아래로 내려 가게 되어 텍스트가 2픽셀 내려 가게 됩니다.

이를 막기 위해서는 14픽셀 이미지를 쓰면 높이가 2픽셀이 낮지만 글자는 아랫줄에 맞게 되죠..

12픽셀 이미지를 쓰게 되면 아래위 2픽셀씩 남게 되어 중간에 위치 하게 됩니다.

위 예제처런 checkbox를 쓰고자 한다면 12픽셀의 체크박스 모양의 이미지를 쓰면 되겠죠..


마지막 업데이트 : (10/7/2011 5:37:26 PM)

TAG : jquery treeview 



첨부 파일 보기 (1)
Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기



<< < 1 2 3 4 5 6 7 8 9 10 > >>