Request.Url 을 이용하시면 url 정보를 가져올수 있습니다.

사용 방법에 따라서 가져오는 데이터가 조금 다릅니다.


우선 사용방법입니다.



Controller 에서 사용하실때



Request.Url.Host : 도메인명

Request.Url.Authority : 도메인명 + 포트번호

Request.Url.Port : 포트번호

Request.Url.AbsolutePath : 도메인명과 포트 그리고 쿼리스트링값이 제외된 전체 주소

Request.ApplicationPath : 현재 응용 프로그램의 가상 경로 값

Request.Url.AbsoluteUri : 도메인명과 포트 그리고 쿼리스트링값이 포함된 전체 주소

Request.Url.PathAndQuery : 도메인명과 포트번호가 제외되고 쿼리스트링이 포함된 주소



View 에서 사용하실때



HttpContext.Current.Request.Url.Host : 도메인명

HttpContext.Current.Request.Url.Authority : 도메인명 + 포트번호

HttpContext.Current.Request.Url.Port : 포트번호

HttpContext.Current.Request.Url.AbsolutePath : 도메인명과 포트 그리고 쿼리스트링값이 제외된 전체 주소

HttpContext.Current.Request.ApplicationPath : 현재 응용 프로그램의 가상 경로 값

HttpContext.Current.Request.Url.AbsoluteUri : 도메인명과 포트 그리고 쿼리스트링값이 포함된 전체 주소

HttpContext.Current.Request.Url.PathAndQuery : 도메인명과 포트번호가 제외되고 쿼리스트링이 포함된 주소



어디서 사용하시던지 사용법은 비슷하시고

결과 값은 동일합니다.


위의 예문을 돌렸을때 나오는 결과 값을 보겠습니다.

결과

(http://abcd.com:777/Board/Index?SchType=Subject&SchTxt=Text <- 실제 주소가 이와 같을 때)



Host - abcd.com

Authority - abcd.com:777

Port - 777

AbsolutePath - /Board/Index

ApplicationPath - /

AbsoluteUri - http://abcd.com:777/Board/Index?SchType=Subject&SchTxt=Text

PathAndQuery - /Board/Index?SchType=Subject&SchTxt=Text



끝!



Posted by T.t.
:


루프문을 돌리거나 기타 여러가지의 이유로 배열의 길이를 알아야하는 경우가 많다.

이경우 사용하면 된다.

기본 배열의 경우 1차원 과 2차원 또는 다차원 배열의 길이를 구하는 방법이 약간 다르다.

그외의 배열은 기본적인 방법은 유사하다.


배열은 기본 배열인 Array와 List<T> 이렇게 살펴보겠습니다.


1차원 배열



1. Array

Ex) Array.Length        // 1차원 배열의 경우 간단히 끝남. 배열의 길이가 반환됨


2. List<T>

Ex) ListT.Count        // List<T>의 경우 Length가 아니라 Count 를 사용함



그 다음은 2차원 또는 다 차원 배열에서 최상단 배열의 크기를 확인하는 방법

결론은 1차원 배열과 똑같습니다.


2차원 배열



1. Array

Ex) Array.Length        // 1차원 배열의 경우 간단히 끝남. 배열의 길이가 반환됨


2. List<T>

Ex) ListT.Count        // List<T>의 경우 Length가 아니라 Count 를 사용함



그리고 아래는 2차원 또는 다차원 배열에서 최상단 배열이 아닌 그 하단 배열의 크기 확인하는 방법입니다.


2차원 배열의 하위 배열 크기



1. Array

Ex)  Array.GetLength(0)    // Length가 아니라 GetLength를 사용. 배열 길이를 구할때 인덱스 0의 배열 길이를 반환함

Array.GetLength(1)    // 다차원 배열에서 배열 길이를 구할때 인덱스 1의 배열 길이를 반환함


2. List<T>

Ex)  ListT.Count            // 인덱스 0의 배열 길이가 반환됨. Count로 다 끝남

ListT[0].Count        // 인덱스 1의 ArrayList[0] 배열의 길이가 반환됨. 조금만 생각해보면 유추가 가능함





이달부터 한달에 한건 포스팅 도전!!



ps. 2019-01-13 : 일부 잘못된 부분 수정



Posted by T.t.
:


Visual Studio 를 사용하면서 Git 을 사용할때 딱히 작업한것도 없고 했는데..

커밋해야 될것이 생길때가 있다.

바로 루트에 존재하는 .vs 라는 숨은 폴더가 그것인데요.

이녀석을 예외처리 시키는 방법입니다.


우선 소스트리를 실행시킵니다.

그리고 해당 프로젝트의 오른쪽 상단의 [설정] 아이콘을 클립합니다.



그러면 창이 하나 뜨는데 그 창에서 [고급 탭] 을 클릭하신후에

[편집] 버튼을 누르시면 됩니다.



그러면 어느 프로그램으로 열건지 물어보는데...

텍스트 편집이 가능한걸로 편한걸로 여십시오. 메모장이나 에디트플러스 같은걸로 여시면 됩니다.


기본적인 사용 방법은


폴더명/

폴더명/파일명.확장자


이런식으로 작성하면 된다.

비주얼 스튜디오에서 .vs/ 폴더를 예외처리시키시려면 아래처럼 하시면 됩니다.


.vs/


아주 간단하죠.

그리고 커밋 및 푸쉬.


조금더 사용 방법을 추가하고자 한다면


ex) /최상위폴더/중간폴더/최하위폴더 가 존재한다고 생각하면


중간폴더 포함 그 하위 폴더를 제외 하려면

**/중간폴더/


최하위폴더를 제외 하려면

**/중간폴더/최하위폴더/


특정 폴더의 특정 확장자(log) 제외

/폴더명/*.log


이런식으로 사용하시면 됩니다.


하지만 이미 커밋되고 푸쉬된 파일이나 폴더는 적용되지않음!


이미 관리에 들어갔던 파일은 제외되지않습니다. 일반적인 삭제를 하더라도 관리 대상으로 추적 당하고 있습니다. 삭제하고 다시 쓰이는 순간 또 관리에 들어가게 되죠. 이렇기 때문에 이미 커밋되고 푸쉬된 파일은 수동으로 제외처리를 해줘야 합니다. 원격 저장소의 캐쉬를 삭제하고 제외시킬 파일을 강제로 제거 해준후에 다시 설정해줘야 합니다.

아래 예문이 있으니 천천히 따라하시면 됩니다.


관리 파일을 관리에서 완전 제외

// 현재 저장소의 캐쉬를 삭제

$ git rm -r --cached .



// [파일명]에 해당하는 파일을 원격 저장소에서 삭제. (로컬 저장소에서 있는 파일은 적용되지않는다)

$ gir rm -r --cached [파일명]



// .gitignore에 적용된 파일을 제외하고 나머지 파일들을 다시 track하도록 한다.

$ git add .





ps. 2018-11-28 이미 푸쉬된 파일 제거하는 방법 추가



Posted by T.t.
:


로컬 Db를 쓰는 경우도 있고 Sql 서버를 별도로 두고 작업하는 경우도 있고..

여러개의 Sql 서버에 접근해야하는 경우도 있지요.

이때 Db 연결자를 추가하거나 변경을 해줘야하는데..

의외로 이걸 물어보는 경우가 있어서...


루트 폴더를 보면 appsettings.json 파일이 있습니다.


/appsettings.json



{

  "ConnectionStrings": {

    "DefaultConnection": "Server= ... "

  },

  "Logging": {

    "IncludeScopes": false,

    "LogLevel": {

      "Default": "Warning"

    }

  }

}


이렇게 되어 있는 부분이 보이실겁니다.

이 중에 빨간색으로 되어 있는 부분이 보이실껍니다.

ConnectionStrings라는 부분의 하위에 있는 것들이 Db 연결자 입니다.

여기서는 DefaultConnection이라는 연결자 하나가 보이는 상태 입니다.

여기다가 연결자 하나를 추가 해 보겠습니다.

연결자 이름은 TtConn 으로 별로의 MsSql 서버로 1433번 포트로 접속한다고 생각하겠습니다.

서버 주소는 test.com이고 Db명은 TestDb고 사용자는 testuser이고 패스워드는 1234라고 가정하겠습니다.


appsettings.json 파일을 수정합니다. 수정한 부분은 녹색이고 콤마 추가된거 조심합시다.


/appsettings.json



{

"ConnectionStrings": {

"DefaultConnection": "Server= ... "

,"TtConn": "Server=Data Source=test.com,1433;Initial Catalog=TestDb;Persist Security Info=True;User ID=testuser;Password=1234"

},

"Logging": {

"IncludeScopes": false,

"LogLevel": {

"Default": "Warning"

}

}

}


1433번은 MsSql기본 포트이고 기본 포트를 사용할 경우 ,1433 은 생략하셔도 됩니다.

도메인 주소 대신에 당연히 Ip를 사용하셔도 됩니다.

간한히 이렇게만 해주시면 연결자가 하나 더 추가되신거고 수정은 저기서 수정할곳이 있으시면 수정하시면 됩니다.



Posted by T.t.
:


버전 정보

.NET Framework 4.7

Mvc 5.2.3.0

입니다.



이전에 비슷한 글을 작성한적이 있다.

개별 사용자 계정 인증을 사용하고 그로인해 생성된 테이블에 추가 정보를 담을 수 있는 컬럼을 만들어 정보를 그 컬럼에 담는 방법이었다.

이번 방법은 사용자 정보를 담는 컬럼이 아니라 테이블 자체를 만들어서 Id 값으로 연결하여 사용하는 방법이 되겠다.


버전이 올라감에 따라 사용자 정보를 담는 테이블명이 바뀌었던것 같고 그래서 차후 버전업을 해야 될 필요성이 생기고하면 지금의 형태가 좀 더 수월하게 진행할 수 있지않을까해서 사용하는 방법이다.


일단 이쯤에서 이전글도 한번 링크 걸겠다.

2014/07/23 - [Asp.Net Mvc] - Mvc5 개별사용자 인증에 추가 정보란 만들기

 

1. 새 프로젝트 생성


1) 새 프로젝트를 생성합니다. Visual C# - 웹 - ASP.NET 웹 응용 프로그램(.NET Framework)를 선택하시고 프레임워크 버전을 4.7로 맞춰 줍니다.


2) MVC를 선택하고 인증 변경 버튼을 눌러줍니다.


3) 인증을 개별 사용자 계정으로 변경하고 확인.


4) 프로젝트 생성



2. 모델(Model) 수정


1) IdentityModels.cs 를 아래처럼 수정합니다. 사용자 닉네임과 등록 시간을 추가로 저장하겠습니다. 녹색 글씨가 추가된 부분입니다.

/Models/IdentityModels.cs



using System;

using System.ComponentModel.DataAnnotations;

using System.Security.Claims;

using System.Threading.Tasks;

using Microsoft.AspNet.Identity;

using Microsoft.AspNet.Identity.EntityFramework;




namespace TestMvc01.Models

{

public class ApplicationUser : IdentityUser

{

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)

{

var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);


return userIdentity;

}

}


public class UsersInfoes

{

[Key]

public string Id { get; set; }


[StringLength(20)]

public string UserNick { get; set; }


public DateTime DateC { get; set; }

}


public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

{

public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false)

{

}


public System.Data.Entity.DbSet<UsersInfoes> UInfoes { get; set; }


public static ApplicationDbContext Create()

{

return new ApplicationDbContext();

}

}

}

 



2) AccountViewModels.cs 를 아래와같이 수정합니다. 닉네임 관련된 부분만 정보를 받도록 하고 등록 시간은 백엔드에서 처리하겠습니다. 추가된 부분은 녹색글씨입니다.

/Models/IdentityModels.cs



public class RegisterViewModel

{

[Required]

[EmailAddress]

[Display(Name = "전자 메일")]

public string Email { get; set; }


[Required]

[StringLength(100, ErrorMessage = "{0}은(는) {2}자 이상이어야 합니다.", MinimumLength = 6)]

[DataType(DataType.Password)]

[Display(Name = "암호")]

public string Password { get; set; }


[DataType(DataType.Password)]

[Display(Name = "암호 확인")]

[Compare("Password", ErrorMessage = "암호와 확인 암호가 일치하지 않습니다.")]

public string ConfirmPassword { get; set; }


[Required]

[StringLength(20, ErrorMessage = "{0}은(는) {2}자 이상이어야 합니다.", MinimumLength = 2)]

[Display(Name = "닉네임")]

public string UserNick { get; set; }

}



3. 뷰(View) 수정


1) Register.cshtml 을 아래와같이 수정하자. 등록 부분에 사용자 닉네임을 추가로 받도록 수정하였습니다. 추가된 구문은 녹색입니다.

/Views/Register.cshtml



@model TestMvc01.Models.RegisterViewModel

@{

ViewBag.Title = "등록";

}


<h2>@ViewBag.Title.</h2>


@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))

{

@Html.AntiForgeryToken()

<h4>새 계정을 만드십시오.</h4>

<hr />

@Html.ValidationSummary("", new { @class = "text-danger" })

<div class="form-group">

@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })

<div class="col-md-10">

@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })

</div>

</div>

<div class="form-group">

@Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })

<div class="col-md-10">

@Html.PasswordFor(m => m.Password, new { @class = "form-control" })

</div>

</div>

<div class="form-group">

@Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })

<div class="col-md-10">

@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })

</div>

</div>

<div class="form-group">

@Html.LabelFor(m => m.UserNick, new { @class = "col-md-2 control-label" })

<div class="col-md-10">

@Html.TextBoxFor(m => m.UserNick, new { @class = "form-control" })

</div>

</div>

<div class="form-group">

<div class="col-md-offset-2 col-md-10">

<input type="submit" class="btn btn-default" value="등록" />

</div>

</div>

}


@section Scripts {

@Scripts.Render("~/bundles/jqueryval")

}



4. 컨트롤러(Controller) 수정


1) AccountController.cs 를 아래와같이 수정하자. 등록 부분을 수정하였습니다. 닉네임은 받아온걸로 처리하고 등록 시간은 현재 시간으로 처리합니다. 녹색이 추가된 부분입니다.

/Controllers/AccountController.cs



[HttpPost]

[AllowAnonymous]

[ValidateAntiForgeryToken]

public async Task<ActionResult> Register(RegisterViewModel model)

{

if (ModelState.IsValid)

{

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };

var result = await UserManager.CreateAsync(user, model.Password);

if (result.Succeeded)

{

await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);


using (ApplicationDbContext db = new ApplicationDbContext())

{

UsersInfoes UsersInfo = new UsersInfoes();

UsersInfo .Id = user.Id;

UsersInfo .UserNick = model.UserNick.Replace(" ", string.Empty);

UsersInfo .DateC = DateTime.Now;


db.UInfoes.Add(UsersInfo );

db.SaveChanges();

}


return RedirectToAction("Index", "Home");

}

AddErrors(result);

}


return View(model);

}



5. 실행


1) 등록으로가서 테스트를 해보도록 하자. 아래는 샘플이다. 정상적으로 잘 작동할것이다.



6. 확인


1) 데이터베이스에 생성된 테이블 확인.

- AspNetUsers : 기본 사용자 테이블

- UsersInfoes : 추가 정보 테이블


2) UsersInfoes 테이블 디자인 화면. 추가한 컬럼들이 잘 보인다.




모든 내용이 끝났다. 조금 더 다루고 싶은 부분도 있었으나...

이거 작성만으로도 나름 꽤 힘들어서 여기서 마무리 짓겠습니다.





Posted by T.t.
:


Asp.net에 Database 객체가 있다.

Db에 접근하여 뭔가를 하는 녀석이다.

그녀석들을 알아보자.



1. Database.Close()

: 데이터베이스와의 연결을 닫습니다. 닫아주는걸 습관화하셔야합니다. 연결이 많이 열려서 문제가 생기면 나중에 잡기가 어려워요.


2. Database.Execute( string commandText, params object[] args )

: commandText 쿼리문을 실행한다. 추가적으로 파라메터를 보낼수 있다. Insert, Update, Delete 문에 주로 사용한다. 작성한 쿼리문을 실행해준다.


3. Database.GetLastInsertId()

: 가장 최근에 삽입된 Id 값을 리턴해준다.


4. Database.Open( string name )

: 지정된 데이터베이스 파일인 name 또는 Web.config에 명명된 연결문자열 name을 사용하여 데이터베이스를 엽니다.


5. Database.OpenConnectionString( string connectionString )

: connectionString 연결 문자열을 이용하여 데이터베이스를 엽니다. 4번과의 차이는 문자열이 담기 string 변수를 사용하는점이 다를뿐입니다.


6. Database.Query( string commandText, params object[] args )

: 쿼리를 실행하고 쿼리 컬렉션 결과를 반환한다. Select 문에 주로 사용하고 추가 파라메터를 보낼수 있다.


7. Database.QuerySingle( string commandText, params object[] args )

: 6번과 동일하나 하나의 행의 결과값을 반환받는다. 8번처럼 사용도 가능합니다.


8. Database.QueryValue( SQLstatement [, parameters] )

: 7번과 유사할수 있는데 하나의 행이 아니라 하나의 값을 반환받습니다.



원래 6, 7, 8만 하려고 했다가 생각나는대로 다 적었다. 예상보다 좀 늘었다.

다 적고나니 어라 예문이 빠졌네...

예문 못달겠다. 사용법이 어렵지않으니 패스..;;



Posted by T.t.
:


웹매트릭스라는 프로그램이 있다. 에디트 플러스같은 느낌의 프로그램이다.

이건 마치 asp.net을 asp나 php처럼 작성가능하게 해준다.

나름 편한부분이 있다.

이 형태를 그냥 비주얼 스튜디오에서 사용하고자하면 에러가 난다.

먼가 선행 조치가 필요하다.

그걸 알아보자.

 

우선적으로 NuGet 팩키지 2개가 필요하다.

 

- Microsoft.AspNet.WebPages.Data - 링크 : https://www.nuget.org/packages/Microsoft.AspNet.WebPages.Data

- Microsoft.AspNet.WebPages.WebData - 링크 : https://www.nuget.org/packages/Microsoft.AspNet.WebPages.WebData

 

각 링크로 들어가면 조금은 자세한 정보가 있다.

필요한 2개의 팩키지가 무엇인지 알았다면 그 다음은 설치이다.

 

 

1. 설치

1) [도구] - [NuGet 패키지 관리자] - [패키지 관리자 콘솔] 을 실행해 준다. (아래 그림 참조)


2) 팩키지 관리자 콘솔창이 뜨면 아래처럼 입력하고 엔터. 뒤에 버전을 추가하면 원하는 버전으로 설치가 가능하고 이렇게 버전을 지정하지않으면 가장 최신 정식 버전이 설치된다.

 

PM> Install-Package Microsoft.AspNet.WebPages.Data

 

 

3) 성공적으로 설치가 마무리되면 다음 팩키지를 설치하자. 팩키지 관리자 콘솔에서 아래처럼 입력하자.

 

PM> Install-Package Microsoft.AspNet.WebPages.WebData

 

 

4) 팩키지 설치는 끝났다. 하지만 하나가 더 남았다.

 

 

2. View (뷰) 에 참조 추가

: 뷰 페이지 상단에 아래처럼 참조 구문을 넣어야 그 뷰 페이지에서 정상적으로 사용이 가능합니다.

 

@using WebMatrix.Data;

 

 

 

이로서 끝이다.

이제 편하게 사용하면 된다.




Posted by T.t.
:


검색 기능 추가이다.
기본 환경은 1편이랑 동일하고 몇몇 구문이 추가가 된다.

 

 

1. Controller 수정

: 우성 컨트롤러부터 수정한다. 가장 기본적인거는 검색어이다. 그런데 변수를 2개 쓴다.

우리가 5페이지를 보고 있다가 갑자기 검색을 하게 된다고 가정을 한다면..

검색된 후 페이지가 어떻게 될까? 아마도 검색 후 1페이지가 아닌 5페이지를 가르키게 된다.

개인적으로는 그래도 된다고 생각한다만;;; 너무 논리적이잖아.. 난 전혀 안이상해..;;

그리고 검색어로 다시 8페이지 보고 있다가 다시 검색할때...

어라 새 검색어야? 아니면 기존에 보고 있던 검색어야? 판단해야 한다..

그래서 부득이하게 이런걸 없애기 위해서 검색어는 2개의 변수에 저장한다.

녹색은 주석이고 파란색이 추가된 부분이다.

 

[Controller]

  

public ActionResult Index(string CurrentSchTxt, string SchTxt, int? Page)
        {

// SchTxt가 신규 검색어이다.

            if (SchTxt != null)
            {

// 신규 검색어가 있으면 페이지는 1페이지로 한다.

Page = 1;

}

else

{

// 신규 검색어가 아닌 기존 검색어가 넘어올경우 기존 검색어를 SchTxt에 넣어준다.

// CurrentFilter 새 검색어가 입력되기 전까지 검색어는 이 녀석이 가지고 있다.

// 그리고 가지고 있는 값을 매번 SchTxt에 넘겨준다.

SchTxt = CurrentSchTxt;

}

 

// 검색어는 ViewBag.CurrentFilter로 뷰에 넘겨준다.

            ViewBag.CurrentFilter = SchTxt;

 

            var banners = from b in db.Banners
                          select b;

 

// 검색어가 있을 경우 검색한다.

if (!String.IsNullOrEmpty(SchTxt))

{

banners = banners.Where(t => b.Title.ToUpper().Contains(SchTxt.ToUpper()));

}

 

// 아래는 단순 정렬

            banners = banners.OrderByDescending(b => t.Id);


            int PageNo = Page ?? 1;
           
            int PageSize = 3;


            return View(banners.ToPagedList(PageNo, PageSize));
        } 

 

 

 

2. View 수정

: 컨트롤러 다음은 뷰다.

우선 상단에서 컨트롤러부터 검색어를 넘겨받는다.

그 후에 페이징 리스트가 표시되는 부분에 페이지를 넘길때 검색어도 같이 넘기는 작업이 필요하다.

그리고 마지막으로 검색창을 단다.

 

[View 상단]

  

@{

// 컨트롤러부터 검색어를 넘겨 받아 변수에 저장한다.

string SchTxt = ViewBag.CurrentSchTxt;

}

 

 

[View 페이징 리스트]

 

 <div>

    <div class="col-xs-12 text-center">
        @Html.PagedListPager(Model, Page => Url.Action("Index", new { Page, CurrentSchTxt = SchTxt }))

    </div>
</div>

 

 

[View 검색창]

  

// 검색창은 수정이 아니라 추가 입니다.

<div class="form-group">

@using (Html.BeginForm("Index", "Banner", FormMethod.Get))

{

<div class="col-xs-8 col-lg-4">

// @value 에 컨트롤러로부터 받아온 검색어를 넣어준다.

@Html.TextBox("SchTxt", null, new { @placeholder = "검색어를 입력해주세요", @value = SchTxt, @class = "form-control input-sm" })

</div>

<div class="col-xs-4 col-lg-2">

// 검색 버튼

<input type="submit" value="검색" class="btn btn-default input-sm" />

</div>

}

</div> 

 

 

 

 

끝이다.

게시판의 꽃인 페지이 및 검색 작업이 아주 쉽게 끝났다.

포스팅도 생각보다 편했다.

그리고 마지막으로 조금전에 혹 해서 찾아본 기능인 엮인글(?) 기능...

혹시 1편을 못보셨다면 준비했습니다~

 

 

- 관련 글 -

2018/06/27 - [Asp.Net Mvc] - Asp.net Mvc PagedList 페이징 처리 (검색 기능 포함) (1)



 

 



Posted by T.t.
:


현재 저의 버전은 아래와 같습니다.

.framework : 4.5.2
Mvc : 5.2.3.0
Paged : 1.17.0
PagedList.Mvc : 4.5.0

게시판의 하이라이트 페이징 기능...
닷넷프레임워크 Mvc로 작업을 했을경우 페이징을 지원하는 패키지가 있는데..
그중 대표적인 라이브러리 중 하나인 PagedList 를 사용해보겠습니다.
우선 적용할 프로젝트가 있고 페이징을 뺀 기본적인 게시판 기능이 만들어져있다는 가정하에 진행하도록 하겠습니다.
그리고 저는 일반 게시판이 아닌 배너 게시판에 페이징 기능을 추가하면서 작업한걸 스샷 찍은거라 Board가 아니라 Banner라는 테이블에 연결되는 혼돈하지말아주세요.

 

1. PagedList 패키지 설치라이브러리 설치

1) 우선 참조에 가셔서 마우스 오른쪽을 누르면 아래와 같이 [NuGet 패키지 관리] 메뉴가 뜹니다. 눌러줍니다.

 

2) 팩키지 관리자 창이 뜨면 찾아보기에서 'pagedlist' 라고 검색합니다. 검색 결과중 아래와 같은 팩키지를 선택하고 오른쪽 창에서 설치를 눌러줍니다. 저는 안정적인 최신 버전인  4.5.0 버전을 설치하는군요.

 

3) 설치를 시작하면 아래와 같이 2개의 팩키지가 설치 된다고  설치할꺼냐고 다시 한번 확인하는 창이 나오네요.

 

4) 설치가 완료되면 하단에 출력창에 [완료] 라고 뜹니다.

 

 

2. Controller 수정

1) Using 지시문을 컨트롤러 맨 상단에 추가하자.

Using PagedList;

 

2) 리스트를 표출하는 ActionResult 가 Index라고 할때, 아래와 같이 변경해주자.

public ActionResult Index(int? Page)

{

// int? Page : 리스트 페이지가 불러올때 null 을 허용하는 int Page 를 받아온다.
// Page 는 현재 호출되는 페이지 번호가 저장되어있다.

// 우선 데이터를 가져옵니다.
var banners = from b in db.Banners
                    select b;

// 현재 페이지 정보가 없다면 1페이지로 간주하고 아니면 페이지 정보를 넘긴다다.
int PageNo = Page ?? 1;

// PageSize : 한 페이지에 불러올 컨텐츠의 수
int PageSize = 3;

return View(banners.ToPagedList(PageNo, PageSize));

 

3. View 수정

1) 기존에 있던 using 지시문을 날리고.. 아래처럼 변경해주자.

 

2) 페이지 리스트가 나올 자리를 잡고 아래구문을 넣어주자.

@Html.PagedListPager(Model, Page => Url.Action("Index", new {Page}))

 

3) 이제 실행해보자. 아래 그림처럼 나온다.

 

4) 2)에서 적용한 코드가 3)의 그림처럼 나오는데 그쪽 코드를 한번 열어봤습니다. 현재 제가 설정한 상태의 버전에서 출력해주는 코드는 아래와 같습니다.

<div class="pagination-container">
    <ul class="pagination">
        <li class="active"><a>1</a></li>
        <li><a href="/Banner?page=2">2</a></li>
        <li class="PagedList-skipToNext"><a href="/Banner?page=2" rel="next">»</a></li>
    </ul>
</div>

 

5) 혹시 3)번의 그림처럼 나오지않는 분들도 있을텐데.. 저의 샘플은 현재 제이쿼리 css와 부트스트랩이 적용된 상태라 위에 처럼 나옵니다. 혹시 다르게 나오시는분들은 팩키지 설치될때 '/Content/PagedList.css' 라는 파일이 같이 설치되었습니다. 뷰 소스 편하신곳에 아래 처럼 삽입하시면 기본적인 디자인이 들어간 형태의 페이징 화면을 보실수 있습니다. 그게 아니면 4)에 코드를 참고하여 스스로 css를 작성해도 됩니다.

<link href="/Content/PagedList.css" rel="stylesheet" type="text/css" />

 

끝.



- 관련글 -


2018/07/11 - [Asp.Net Mvc] - Asp.net Mvc PagedList 페이징 처리 (검색 기능 포함) (2)




Posted by T.t.
:


문자열 비교를 할때가 많다.

보통 변수A == 변수B 이런형태로도 많이 비교한다.

대소문자의 구분 유무로 인해서 ToUpper() 나 ToLower() 를 사용해서 사용하기도 한다.

하지만 크기 비교를 해야할때도 있다. 문자열을 크기 비교라니..;; 현실은 자주 쓴다..ㅋ

그래서 asp.net 에는 문자열 비교 함수가 준비되어있다.

 

1. Compare

string.Compare (string StrA, string StrB, bool BoolC)

: 비교할 문자열 2개가 필요하고 bool 타입은 대소문자 무시여부이다. true는 대소문자 무시(A = a로 인식), false는 대소문자 비교, 생략시 false.
문자열 비교 값이 같을 경우 0을 반환하며 문자열 크기 비교도 가능하다. A보다 B가 크다.
조건문을 쓸때는 if (string.Compare(StrA, StrB, true) == 0) 이런 형태로 써야 한다.
간혹 if (string.Compare(StrA, StrB, true)) 이런 형태의 실수를 종종하게 된다. 물론 저도..ㅋㅋ;;

ex1) string.Compare("AA", "aa", true)

결과 : 0

ex2) string.Compare("AA", "aa", false)

결과 : 1

ex3) string.Compare("AA", "BB")

결과 : -1

 

2. CompareTo

StrA.CompareTo(StrB)

: 비교할 문자열 2개만 있으면 비교가 되며 string.Compare과의 차이점은 대소문자를 무조건 비교한다는 정도가 되겠다.
반환하는 결과도 같고, 정렬에 적합한 함수라 한다. 대소문자 구분의 필요성에 따라 분류해서 쓰는편이다.

ex1) "AAA".CompareTo("aaa")

결과 : 1

ex2) "AAA".CompareTo("AAA")

결과 : 0

ex3) "AAA".CompareTo("BBB")

결과 :

 

3. Equals , ==

StrA.Equals(StrB) 과 StrA == StrB

: 이런 형태가 실제로는 많이 쓰이고 있는걸로 알고 있다. 단순 비교일때는 저도 많이 씁니다. 이 둘은 유사해 보이나 실제로는 Equals 는 값을 비교하고, == 는 객체 참조를 비교합니다. 그래서 같은 타입끼리의 비교는 차이가 없지만 다른 타입끼리의 비교에는 차이가 생깁니다. 이 두녀석은 간단하게 이정도만 언급하겠습니다. 예문은 이해하기 편하게 숫자타입으로 했습니다.

ex1) Convert.ToInt16(0).Equals(Convert.ToInt64(0))

결과 : False

ex2) Convert.ToInt16(0) == Convert.ToInt64(0)

결과 : True

 

찾아보면 더 있을지도 모르나 이정도가 대표적일것 같습니다. Compare와 CompareTo의 차이점으로 하려다가 일반적으로는 == 를 제일 많이 쓸것도 같고해서 글이 좀 늘어나버렸고 마무리 정리가 좀 이상하긴하지만 이정도가 있다는 정도만으로 봐주시면 고맙겠습니다.



Posted by T.t.
: