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


버전 정보

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