버전 정보

.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.
: