iT邦幫忙

2022 iThome 鐵人賽

DAY 15
1
Software Development

C# ASP.NET MVC實作: 30天打造屬於你的網站應用程式系列 第 15

(DAY 15)C# ASP .NET MVC實作: 30天打造屬於你的網站應用程式-建立購物中心網站實際範例(三)

  • 分享至 

  • xImage
  •  

昨天將Layout版面完成了,並且也將Model加上驗證屬性,今天開始來寫控制器方法與對應的頁面。

首先將MVC範本預設產生的幾個動作方法刪除,找到HomeController底下的About()Contact()並刪除,這些動作方法我們不會使用到。

接著也將對應的View頁面刪除,包含Home資料夾底下的About.cshtmlContact.cshtml,另外Index.cshtml也刪除,因為我們要直接重寫其內容。

上述完成後就可以來逐一建立各動作方法與其檢視頁面囉~

● Home/Index

在HomeController新增如下Code:

    public class HomeController : Controller
    {
        dbShoppingCarEntities db = new dbShoppingCarEntities();
        public ActionResult Index()
        {
            var products = db.table_Product.OrderByDescending(m => m.Id).ToList();
            return View(products);
        }
    }

首先建立資料庫實體物件,為了可以重複使用我們寫在Controller類別內作為類別中的欄位,而不是各個動作方法內。
Index()動作方法內則是獲取所有產品資料,並依照產品的Id降冪排序,最後將產品List傳入View使用。

接著新增對應的View,使用預設版面配置頁,不使用範本。

建立後頁面如下圖:

接著將裡面的Code修改如下:

@using DemoShoppingWebsite.Models
@model IEnumerable<table_Product>
@{
    ViewBag.Title = "商品瀏覽";
}

<div class="row" style="margin-top:10px">
    @foreach (var item in Model)
    {
        <div class="col-md-4">
            <div class="thumbnail">
                <img src="~/image/@item.Image" style="width:300px;height:270px" />
                <div class="caption">
                    <h3>@item.Name</h3>
                    <h4>單價:@item.Price</h4>
                    <p>
                        <a href="@Url.Action("AddCar","Member")?ProductId=@item.ProductId" class="btn btn-primary">加入購物車</a>
                    </p>
                </div>
            </div>
        </div>
    }
</div>

簡單利用foreach迴圈將產品List裡面的圖片、品名、價格呈現出來,並且會有「加入購物車」的按鈕,按鈕連結的網址使用@Url.Action()方法動態產生,網址後面攜帶ProductId參數。這邊用到滿多HTML標籤與CSS樣式,可以自行比較看看有無添加樣式的差異,這邊不細談。

完成後就可以先執行看看,畫面如下圖:

● Home/Register (GET)

接著撰寫註冊頁面內容,在HomeController底下新增Register()動作方法,如下Code:

        public ActionResult Register()
        {
            return View();
        }

新增對應View,加入檢視時依下圖選擇範本與模型來源:

加入後即會自動產生View頁面,我們稍微修改一下內容:

  • 第4行修改ViewBag.Title 為 "會員註冊"。
  • 第7行修改<h2>內文字為 "會員註冊"。
  • 第14行<h4>table_Member</h4>刪除不保留。
  • 第51行<input>標籤內value改為 "註冊"。
  • 第52行增加@ViewBag.Message,用來呈現註冊不成功時的訊息內容。
  • 第58行~60行<div>標籤和裡面的@Html.ActionLink()不會用到所以也全刪除。

完整Code如下:

@model DemoShoppingWebsite.Models.table_Member

@{
    ViewBag.Title = "會員註冊";
}

<h2>會員註冊</h2>

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    
    <div class="form-horizontal">

        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.UserId, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.UserId, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.UserId, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="註冊" class="btn btn-default" />
                @ViewBag.Message
            </div>
        </div>
    </div>
}




修改完成後執行畫面如下:

● Home/Register (POST)

接著撰寫註冊的POST方法,在HomeController裡面新增下方Code:

        [HttpPost]
        public ActionResult Register(table_Member Member)
        {
            //如果資料驗證未通過則回傳原本的View
            if (!ModelState.IsValid)
            {
                return View();
            }

            // 如果註冊的帳號不存在,才能執行新增與儲存
            var member = db.table_Member.Where(m => m.UserId == Member.UserId).FirstOrDefault();
            if (member == null)
            {
                db.table_Member.Add(Member);
                db.SaveChanges();

                return RedirectToAction("Login");
            }
            ViewBag.Message = "帳號已被使用,請重新註冊";
            return View();
        }

這邊主要有2個重點:

  1. 資料驗證未通過會回傳原本的View,並會顯示錯誤訊息

  2. 如果註冊的帳號已存在就不能重複新增,會顯示 "帳號已被使用,請重新註冊" 的訊息;反之如果不存在代表註冊帳號沒重複,才能執行新增與儲存,並跳轉到登入畫面。

● 小結

今天把註冊的功能完成啦,只是按下註冊後會轉至登入畫面的部分還沒做,這時就算註冊成功也會顯示錯誤。那麼明天就繼續來做登入的部分,我們明天見!


上一篇
(DAY 14)C# ASP .NET MVC實作: 30天打造屬於你的網站應用程式-建立購物中心網站實際範例(二)
下一篇
(DAY 16)C# ASP .NET MVC實作: 30天打造屬於你的網站應用程式-建立購物中心網站實際範例(四)
系列文
C# ASP.NET MVC實作: 30天打造屬於你的網站應用程式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
alexjsj
iT邦新手 5 級 ‧ 2023-12-12 16:37:08

● Home/Index
在HomeController新增如下Code:

dbShoppingCarEntities db = new dbShoppingCarEntities();

這行出現以下錯誤
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs0246?f1url=%3FappId%3Droslyn%26k%3Dk(CS0246)

0
alexjsj
iT邦新手 5 級 ‧ 2023-12-12 16:39:37

延續上面問題
執行home/index後出現的錯誤

'/' 應用程式中發生伺服器錯誤。
並未將物件參考設定為物件的執行個體。
描述: 在執行目前 Web 要求的過程中發生未處理的例外狀況。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。

例外狀況詳細資訊: System.NullReferenceException: 並未將物件參考設定為物件的執行個體。

原始程式錯誤:

行 6:
行 7:
行 8: @foreach (var item in Model)
行 9: {
行 10:

0
alexjsj
iT邦新手 5 級 ‧ 2023-12-12 16:56:45

改成dbShoppingCarEntities2 db = new dbShoppingCarEntities2();
就正常

是否有哪邊設定要更動?
謝謝!

我要留言

立即登入留言