ViewBag을 이용한 전달

다이나믹(Dynamic) 오브젝트로 되어 있고 자동으로 변수형을 유추하기 때문에 사용 시 형 변환이 필요 없습니다.

public ActionResult Index()
        {
            ViewBag.userName = "조동연";
 
            return View();
        }

 

    <div>
        이름 : @ViewBag.userName <br />
    </div>

 

 

 

 

List에 데이터를 담고 viewbag으로 view단으로 던지는 것도 가능합니다.

public List<string> TestList()
{
    List<string> Student = new List<string>();
    Student.Add("Jignesh");
    Student.Add("Tejas");
    Student.Add("Rakesh");
 
    return Student;
}
ViewBag.Student = this.TestList();
@foreach (var student in ViewBag.Student)
{
    <li>@student</li>
}

 

 

 


 

 

ViewData를 이용한 전달

딕셔너리(Dictionary) 콜랙션으로 되어 있습니다.

뷰백에 비해 속도가 빠릅니다.

값(Value)이 오브젝트로 나오기 때문에 형 변환을 해야 합니다.

 

위의 TestList 메서드를 사용할 때

ViewData["Student"] = this.TestList();
@foreach (var student in ViewData["Student"] as List<string>)
{
    <li>@student</li>
}

 

 

 

 


 

 

 

DATASET 클래스

 

DataSet 클래스는 클라이언트 메모리 상에 존재하는 테이블들을 가지며, 서버와의 연결을 유지하지 않는다.

DataSet 클래스는 개발자가 직접 모든 테이블 구조 만들고 데이터 삽입 등을 할 수 있으나,

일반적으로 DataAdapter (예: SqlDataAdapter)를 이용하여 데이터를 서버로부터 가져와 메모리상의 DataSet에 할당 후 사용한다.

 

public ActionResult Index()
        {

            DataSet ds = new DataSet();
            ds = User_DAL.Select_User();

            return View(ds);
        }
public static DataSet Select_User()
        {
            con.Open();

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;

            cmd.CommandText = string.Format("SELECT [Num],[Title],[Name],[Date] FROM [TEST_PROFILE].[dbo].[USER] order by [Num] desc");

            cmd.CommandType = CommandType.Text;
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;

            DataSet ds = new DataSet();
            da.Fill(ds, "[TEST_PROFILE].[dbo].[USER]");
            con.Close();

            return ds;
        }
    <tbody>
        @foreach (DataRow row in Model.Tables["[TEST_PROFILE].[dbo].[USER]"].Rows)
        {
        <tr>
            <th>@(row["Num"])</th>
            <th>@(row["Title"])</th>
            <th>@(row["Name"])</th>
            <th>@(row["Date"])</th>
        </tr>
        }
    </tbody>

 

 


 

 

ActionLink

 

<a href="/Home/LoginView?str=a태그">링크</a

a 태그와 같이 동작하는 actionlink

@Html.ActionLink("링크", "LoginView", "Home")

@Html.ActionLink("링크", "LoginView", new { id = 1 })

첫 번째처럼 경로를 명시할 수 도 있고 

두 번째처럼 인자 값을 넣어 연결할 수 도 있다.

 


 

RedirectToAction 메소드

HTML을 랜더링 하는 대신, 다른 액션 메서드를 호출할 때 사용된다. 

 


js  window.location.href

 

javascript로 ajax통신이 아닌 리다이렉트로 url을 이동시켜야할 때 사용한다.

인자값 (ex id)을 url에 넣어 게시물 상세보기가 가능하다.

window.location.href = "https://localhost:44334" + "/Home/About/" + id;

 

 


html form태그 

<form method="post"  action ="/Home/Insert">
	<input type="text" name="Title" placeholder="글 제목">
</form>

<input type="submit" value="글쓰기">

form태그로 식별가능한 name값을 넣고 input type=submit으로 서버에 전송한다

public ActionResult Insert(User user)
        {
            string title = user.Title;
            dbSystem.Insert_User(title);

            return RedirectToAction("Index");
        }

 

 

 

하나의 form태그의 submit 두개 (자바스크립트로 분기한다.)

<input type="button" value="글수정" onclick='return info_chk2(this.form);'>
function info_chk2(frm) {
    frm.action = '/Home/Update';
    frm.submit(); return true;
}

 

 

 


 

개요 : 처음으로 c# asp.net을 써야할 일이 생겨서 맛보기로 CRUD 게시판을 만들어보았다. 

 

주의 : 이것저것 공부하면서 막 시도하며 만들다보니 변수명도 클래스명도 코드도 바보같음 주의 

 

의의 : 그러나 점차 기능을 붙여 발전된 형태로 만들며 연습할 것이고 나와 같이 db연결도 못하는 분에게 약간의 도움이라도 되었으면 하는 마음 

 

특징 : 회사 서버로 db연결함 (인터넷엔 로컬db로 연결하는 글이 대부분이라 설정값 찾는데 헤맸다...)

 

툴 : visualstudio2022 , ssms


게시판 미리보기


프로젝트 asp.net web application 실행 

 

mvc패턴으로 생성 

 

 

 


DB연결 

 

나는 두가지 방법으로 해보았다.

1. webConfig에서 connectionStrings으로 db연결 

 

2. cs 파일에서 using문을 사용하여 db연결 (이건 나중에 코드에서)

 

우선 1번 

 

...
    
    <connectionStrings>
		<add name="UserDB" connectionString="Data Source=ip 작성,port 작성; 
          Initial Catalog=TEST_PROFILE;User ID=sa;Password=123456789"
		  providerName="System.Data.SqlClient" />  
	</connectionStrings>
		
</configuration>

 

Connection String 방식

- name : 코드에서 연결될 이름

- Data Source : 서버명
- Initial Catalog : database 이름
- Integrated Security=SSPI  : db 서버 접근 인증이 windows 인증 방식인 경우(난 회사 db라 안씀)
- User ID=yourid;Password=yourpass ; db 서버 접근 인증이 SQL 인증 방식인 경우
출처: https://freeprog.tistory.com/221 [취미로 하는 프로그래밍 !!!]

SqlDataSource.ProviderName 속성
System.Data.SqlClient 공급자는 기본.NET Framework Data Provider for SQL Server입니다.
System.Data.OleDb 공급자는.NET Framework Data Provider for OLE DB입니다.
System.Data.Odbc 공급자는.NET Framework Data Provider for ODBC입니다.
System.Data.OracleClient 공급자는.NET Framework Data Provider for Oracle입니다.
출처 : https://docs.microsoft.com/ko-kr/dotnet/api/system.web.ui.webcontrols.sqldatasource.providername?view=netframework-4.8

 

 


namespace WebApplication9.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {

            DataSet ds = new DataSet();
            ds = User_DAL.Select_User();

			return View(ds);
        }
     }
}

RouteConfig.cs에 설정값인 시작 controller와 action명이 명시되어있는 곳 부터 시작하여 

DataSet에 게시판 글을 table data를 넣어 view로 리턴할 것이다.

 

출처:https://www.soowave.com/entry/ASPNET-MVC-3-MSSQL-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-INSERT

User_DAL..cs 생성

 


namespace WebApplication9.DAL
{
	public class User_DAL

    {

        public static SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["UserDB"].ToString());

		public static DataSet Select_User()
        {
            con.Open();

            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;

            cmd.CommandText = string.Format("SELECT [Num],[Title],[Name],[Date] FROM [TEST_PROFILE].[dbo].[USER] order by [Num] desc");

            cmd.CommandType = CommandType.Text;
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;

            DataSet ds = new DataSet();
            da.Fill(ds, "[TEST_PROFILE].[dbo].[USER]");
            con.Close();

            return ds;
        }
     }
}

SqlConnection으로 webconfig에 설정해놓은 name인 UserDB 매핑해주기

 


@model System.Data.DataSet
@using System.Data

@{
    ViewBag.Title = "Home Page";
}

<br />
<table class="table">
    <thead>
        <tr>
            <th>번호</th>
            <th>제목</th>
            <th>작성자</th>
            <th>날짜</th>
        </tr>
    </thead>
    <tbody>
        @foreach (DataRow row in Model.Tables["[TEST_PROFILE].[dbo].[USER]"].Rows)
        {
        <tr>
            <th>@(row["Num"])</th>
            <th>@Html.ActionLink("" + row["Title"], "About", new { id = row["Num"] })
            <th>@(row["Name"])</th>
            <th>@(row["Date"])</th>
        </tr>
        }
    </tbody>
</table>
<hr />

<button class="btn btn-default">@Html.ActionLink("글 쓰기", "About", "Home")</button>

view단 게시판 간단하게 select 완료

 

 


string strConn = "Data Source=ip,port;Initial Catalog=TEST_PROFILE;User ID=id;Password=12345679;";

string sql = "select * from [TEST_PROFILE].[dbo].[USER]";

 using (SqlConnection conn = new SqlConnection(strConn))
 using (SqlCommand cmd = new SqlCommand(sql, conn))
 {
     try
     {
         conn.Open();

         using (SqlDataReader rdr = cmd.ExecuteReader())
         {
             while (rdr.Read())
             {
                 String num = rdr["Num"] as string;
                 String title = rdr[1] as String;
                 String name = rdr[2] as String;
                 String date = rdr[3] as String;
                 Console.WriteLine(" {0}, {1}, {2}, {3}", name, title, name, date);
             }
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine(" ============= exception ===============");
         Console.WriteLine(ex.Message);
     }

 }

이런식으로 using을 사용하여 바로 db연결하여 사용도 가능 

그러나 호출 할 때 마다 저렇게 db 정보를 적는것보다 web.config에서 관리하는게 당연히 더 나은 방식으로 보인다.

출처 : https://freeprog.tistory.com/221

 

 

 


다음 crud는 

https://github.com/jodongyeon/boardEx

있습니당.

+ Recent posts