初學ASP.NET MVC 學習筆記(六)-包裝Model

初學ASP.NET MVC 學習筆記(六)

最近上班一直在看MVC的網站,今天就寫一些心得順便紀錄和熟悉一下寫法。

Models是商業邏輯,Controllers是控制前後端的角色,View負責輸出頁面,這些都老生常談了

不過一般為了不在Controllers中寫太多邏輯,所以負責資料庫存取的Code會另外再包一個資料夾

在Models裡面,名字取為Repository,所以現在專案架構是這樣:

f6d0cbfe3af644e69013515fa4f0cec2

實際上當然是沒這麼簡單啦,不過只是個概念而已。\

然後弄一個簡單的資料庫出來,新增一個LINQ to SQL

0fa1f09e956242d49b0c645f207432b3

然後在Repository資料夾底下新增一個類別,叫做ProductRepository,負責控制Product這張表


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MVCTest_2.Models;

namespace MVCTest_2.Repository
{
    public class ProductRepository
    {
        private MYDBDataContext db = new MYDBDataContext();

        public IQueryable<Product> GetAllProducts(int Count)  
        //抓出所有Product資料,參數可決定筆數,如果為0就傳回全部
        {
            var p = from d in db.Product select d;
            return (Count > 0 ? p.Take(Count) : p);
        }

        public Product GetProductByID(Guid id)   //用Product的PK抓出某一筆Product資料
        {
            var p = (from d in db.Product where d.ID.Equals(id) select d).FirstOrDefault();
            return p;
        }
        
        public void InsertProduct(Product product)   //新增一筆Product資料
        {
            db.Product.InsertOnSubmit(product);
        }
       
        public bool DeleteProduct(Guid id)   //刪除一筆資料
        {
            var p = (from d in db.Product where d.ID.Equals(id) select d).FirstOrDefault();
            if (p == null)
            {
                return false;
            }
            else
            {
                db.Product.DeleteOnSubmit(p);
                return true;
            }       
        }

        //不外乎就是新增刪除抓資料的方法....
    }
}

 

 

其他幾個資料庫也是類似這個寫法,完成後。。。

0e21bc1038b94d6fb354cacbfd19cfdf

之後在Controller中就可以用這些類別來操作資料庫

接著,教學範例有教到怎麼把資料丟到View裡面,但如果我們一次要傳很多張table的資料

可以用ViewData,也可以把要丟的資料在包成一個類別再丟,如下說明

建一個資料夾叫ViewModels,裡面建一個IndexViewModel,表示我首頁可能會包到的資料

b2dd5f590b534ef79df211672a652e3b

裡面寫的很簡單,例如我的首頁要放產品列表,新聞列表,跟廣告列表,我就包三個屬性

在HomeController裡這樣寫


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVCTest_2.ViewModels;
using MVCTest_2.Repository;

namespace MVCTest_2.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        private ProductRepository product;   //把Repository中的類別建成欄位
        private ADRepository ad;
        private NewsRepository news;

        public HomeController()   //建構子中初始化
        {
            product = new ProductRepository();
            ad = new ADRepository();
            news = new NewsRepository();
        }

        public ActionResult Index()
        {
            IndexViewModels lvm = new IndexViewModels();  //new 一個IndexViewModels的物件
            lvm.Product = product.GetAllProducts(0);
            //使用ProductRepository中的GetAllProducts抓出所有產品資料
            //塞到IndexViewModels的Product屬性中
                                                   
            lvm.News = news.GetAllNews(0);    //同上,抓出新聞資料,塞到IndexViewModels裡
            lvm.AD = ad.GetAllAD(0);          //同上,抓出廣告資料,塞到IndexViewModels裡

            return View(lvm);     //傳回IndexViewModels物件
        }

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

 

 

 

然後在View中就可以這樣抓:


    <% foreach (var item in Model.Product) { %>
    
        <tr>
            
            <td>
                <%= Html.Encode(item.ID) %>
            </td>
            <td>
                <%= Html.Encode(item.ProductName) %>
            </td>
            <td>
                <%= Html.Encode(String.Format("{0:F}", item.ProductPrice)) %>
            </td>
            <td>
                <%= Html.Encode(item.ProductQuantity) %>
            </td>
        </tr>
    
    <% } %>

<tr><td> </td></tr>
    
    <% foreach (var item in Model.News) { %>
    
        <tr>
            
            <td>
                <%= Html.Encode(item.ID) %>
            </td>
            <td>
                <%= Html.Encode(item.NewsDate) %>
            </td>
            <td>
                <%= Html.Encode(item.NewsName) %>
            </td>
            <td>
                <%= Html.Encode(item.NewsContent) %>
            </td>
        </tr>
    
    <% } %>
<tr><td> </td></tr>
    <% foreach (var item in Model.AD) { %>
    
        <tr>
           
            <td>
                <%= Html.Encode(item.ID) %>
            </td>
            <td>
                <%= Html.Encode(item.AdName) %>
            </td>
            <td>
                <%= Html.Encode(String.Format("{0:F}", item.AdPicture)) %>
            </td>
            <td>
                <%= Html.Encode(item.AdDescription) %>
            </td>
        </tr>
    
    <% } %>

最重要的是Page的第一行,要把命名空間+類別名稱放進來


<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
 Inherits="System.Web.Mvc.ViewPage<MVCTest_2.ViewModels.IndexViewModels>" %>

IndexViewModels在MVCTest_2.ViewModels這個命名空間底下,

所以Inherits="System.Web.Mvc.ViewPage<MVCTest_2.ViewModels.IndexViewModels>"

然後在跑迴圈的時候,就可以用Model點你要的資料,例如Models.News,迴圈跑出來就是一筆一筆

的資料囉!