iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
自我挑戰組

.NET Core MVC網頁應用開發系列 第 14

.NET Core第14天_檢視模型ViewModel_Controller跟View雙向資料傳遞方式

視圖(檢視)模型 / ViewModel
主要用於為View提供資料

ViewModel當中的屬性不一定會跟資料表欄位一一對應,因為在該View中
可能存在多個資料表中的資料,也因此在ViewModel設計屬性集合中也會是來自於多個表(可能有join的操作)
一般存放在Models目錄,但非必須。

創建好新的.net5 mvc專案後
在Models目錄新增一個Student Model Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Net5App6.Models
{
    public class StudentViewModel
    {
        /// <summary>
        /// 學生編號
        /// </summary>
        public int Id { get; set; }
        /// <summary>
        /// 學生姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 學生年齡
        /// </summary>
        public int Age { get; set; }
        /// <summary>
        /// 學生性別
        /// </summary>
        public string Sex { get; set; }
    }
}

Controller向View傳遞資料
新增一個StudentController.cs

using Microsoft.AspNetCore.Mvc;
using Net5App6.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Net5App6.Controllers
{
    public class StudentController : Controller
    {
        public IActionResult Show()
        {
            var model = new StudentViewModel()
            {
                Id=1,
                Name="李曉明",
                Age=21,
                Sex="男"
            };
            return View(model);
        }
    }
}

Show檢視

<h3>Controller向View傳遞ViewModel資料</h3>
@model StudentViewModel

<div>
    <ul>
        <li>@Model.Id</li>
        <li>@Model.Name</li>
        <li>@Model.Age</li>
        <li>@Model.Sex</li>
    </ul>
</div>

https://ithelp.ithome.com.tw/upload/images/20210916/20107452qtVG2Zc6CV.png

View向Controller傳遞資料

新增Add Action Method
一個類似表單提交情境
通常會有一個透過Get負責顯示表單畫面的Action
跟表單POST提交的Action
StudentController.cs

using Microsoft.AspNetCore.Mvc;
using Net5App6.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Net5App6.Controllers
{
    public class StudentController : Controller
    {
        public IActionResult Show()
        {
            var model = new StudentViewModel()
            {
                Id=1,
                Name="李曉明",
                Age=21,
                Sex="男"
            };
            return View(model);
        }

        /// <summary>
        /// 顯示表單
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult Add()
        {
            return View();
        }

        /// <summary>
        /// 表單提交
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Add(StudentViewModel model)
        {
            int id = model.Id;
            string name = model.Name;
            int age = model.Age;
            string sex = model.Sex;
            //後續資料處裡....

            return View();
        }
    }
}

新增好Add檢視
Add.cshtml

@{ 
    ViewData["Title"] = "表單資料添加";
}

@model StudentViewModel
<form asp-controller="Student" asp-action="Add" method="post" class="form-horizontal" style="width:500px">
    <div class="form-horizontal">
        <h4>@ViewData["Title"]</h4>
        <hr />
        <div class="form-group">
            <label asp-for="Name" class="control-label col-md-2"></label>
            <div class="col-md-10">
                <input type="text" asp-for="Name" class="form-control" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="Age" class="control-label col-md-2"></label>
            <div class="col-md-10">
                <input type="text" asp-for="Age" class="form-control" />
            </div>
        </div>
        <div class="form-group">
            <label asp-for="Sex" class="control-label col-md-2"></label>
            <div class="col-md-10">
                <input type="text" asp-for="Sex" class="form-control" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="提交" class="btn btn-primary" />
            </div>
        </div>
    </div>
</form>

運行之後可以模擬輸入完表單資料提交

https://ithelp.ithome.com.tw/upload/images/20210916/20107452ZJrCYCXbSe.png

https://ithelp.ithome.com.tw/upload/images/20210916/201074528CkKwjHRNQ.png

本篇也已同步發表至個人部落格
https://coolmandiary.blogspot.com/2021/08/net-core14viewmodelcontrollerview.html


上一篇
.NET Core第13天_View常見操作_Layout佈局頁_PartialView部分檢視_強類型視圖(大量資料或物件的傳遞)
下一篇
.NET Core第15天_MVC的TagHeper使用_微軟Web應用框架中前端部分的演進
系列文
.NET Core MVC網頁應用開發30

尚未有邦友留言

立即登入留言