我們已經(jīng)完成了網(wǎng)站的大部分工作,但是,還有一些添加到站點(diǎn)的導(dǎo)航功能,主頁(yè),以及商店的瀏覽頁(yè)面。
我們希望在整個(gè)站點(diǎn)的頁(yè)面上都可以看到購(gòu)物車中的數(shù)量。
通過(guò)創(chuàng)建一個(gè)部分視圖,然后添加到網(wǎng)站的布局中就可以容易地完成,
前面看到,在 ShoppingCart 控制器中包含了一個(gè)名為 CartSummary 的 Action 方法返回分部視圖。
//
// GET: /ShoppingCart/CartSummary
[ChildActionOnly]
public ActionResult CartSummary()
{
var cart = ShoppingCart.GetCart(this.HttpContext);
ViewData["CartCount"] = cart.GetCount();
return PartialView("CartSummary");
}
在這個(gè) Action 方法上點(diǎn)擊鼠標(biāo)右鍵,或者在 Views/ShoppingCart 文件夾夾上點(diǎn)擊鼠標(biāo)右鍵,選擇創(chuàng)建新視圖,命名為 CartSummary ,注意選中創(chuàng)建分部視圖的復(fù)選框。
CartSummary 分部視圖非常簡(jiǎn)單,僅僅鏈接到 ShoppingCart 的 Index ,顯示當(dāng)前購(gòu)物車中的數(shù)量,完整的代碼如下:
@Html.ActionLink("Cart (" + ViewData["CartCount"] + ")", "Index", "ShoppingCart", new { id = "cart-status" })
在網(wǎng)站的任何頁(yè)面中都可以包含分部視圖,使用 Html.RenderAction 方法就可以。RenderAction 需要指定 Action 的名字,這里是 CartSummary,以及控制器的名字,這里是 ShoppingCart。
@Html.RenderAction("CartSummary", "ShoppingCart")
在將這個(gè)分部視圖加入到布局之前,我們還要?jiǎng)?chuàng)建一個(gè)流派的菜單,這樣我們可以一次更新完站點(diǎn)的 Site.master。
通過(guò)在頁(yè)面上增加一個(gè)流派的菜單,可以是用戶在站點(diǎn)內(nèi)導(dǎo)航的時(shí)候更加容易。
我們可以使用類似前面的步驟來(lái)創(chuàng)建流派菜單的分部視圖,把兩個(gè)分部視圖一起添加到站點(diǎn)的布局中,首先,在 StoreController 中增加 GenreMenu 的控制器方法。
//
// GET: /Store/GenreMenu
[ChildActionOnly]
public ActionResult GenreMenu()
{
var genres = storeDB.Genres.ToList();
return PartialView(genres);
}
這個(gè)方法返回流派的列表,在后面創(chuàng)建的視圖中用來(lái)生成菜單。
注意:在 Action 方法上我們?cè)黾恿?[ChildActionOnly] 標(biāo)注,這意味著我們僅僅可以通過(guò)分部視圖來(lái)訪問(wèn)這個(gè) Action,這可以防止通過(guò)瀏覽 /Store/GenreMenu 來(lái)訪問(wèn),對(duì)于分部視圖來(lái)說(shuō),這不是必須的,但是一個(gè)很好的實(shí)踐,因?yàn)槲覀兿M覀兊目刂破鞣椒ū晃覀兿M姆绞绞褂?,這里我們還返回了一個(gè)分部視圖而不是一個(gè)普通的視圖,這用來(lái)告訴視圖引擎,不需要對(duì)這個(gè)視圖使用布局,它將會(huì)被包含在其他的視圖中。
創(chuàng)建分部視圖,使用強(qiáng)類型的 Genre 作為模型類型。使用 List 模板。
更新生成的視圖,顯示一個(gè)列表。
@model IEnumerable<MvcMusicStore.Models.Genre>
<ul id="categories">
@foreach (var genre in Model)
{ <li>@Html.ActionLink(genre.Name,
"Browse", "Store",
new { Genre = genre.Name }, null)
</li>
}
</ul>
現(xiàn)在,可以在布局中加入分部視圖了,在 /Views/Shared/_Layout.cshtml 中通過(guò)調(diào)用 Html.RenaderAction() 方法可以調(diào)用分部視圖,把兩個(gè)分部視圖都加入到布局中,如下所示:
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet"
type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")"
type="text/javascript"></script>
</head>
<body>
<div id="header">
<h1>
<a href="/">ASP.NET MVC MUSIC STORE</a></h1>
<ul id="navlist">
<li class="first"><a href="@Url.Content("~")" id="current">Home</a></li>
<li><a href="@Url.Content("~/Store/")">Store</a></li>
<li>
@{Html.RenderAction("CartSummary", "ShoppingCart");}
</li>
<li><a href="@Url.Content("~/StoreManager/")">Admin</a></li>
</ul>
</div>
@{Html.RenderAction("GenreMenu", "Store");}
<div id="main">
@RenderBody()
</div>
<div id="footer">
built with <a >ASP.NET MVC 3</a>
</div>
</body>
</html>
商店的瀏覽頁(yè)面現(xiàn)在看來(lái)還不太好,我們更新這個(gè)頁(yè)面在一個(gè)更好地布局中顯示專輯,如下更新我們的視圖。
@model MvcMusicStore.Models.Genre
@{ ViewBag.Title = "Browse Albums"; }
<div class="genre">
<h3>
<em>@Model.Name</em> Albums</h3>
<ul id="album-list">
@foreach (var album in Model.Albums)
{ <li><a href="@Url.Action("Details", new { id = album.AlbumId })">
<img alt="@album.Title" src="@album.AlbumArtUrl" />
<span>@album.Title</span> </a></li> }
</ul>
</div>
這里,我們將使用 Url.Action 來(lái)代替 Html.ActionLink ,以便顯示格式化信息,包括藝術(shù)家的插畫。
注意:我們顯示專輯的封面,這些信息保存在數(shù)據(jù)中,可以通過(guò) StoreManager 進(jìn)行編輯,也歡迎你加入你的插圖。
現(xiàn)在,當(dāng)我們?yōu)g覽流派的時(shí)候,我們將會(huì)看到帶有封面的專輯顯示在一個(gè)網(wǎng)格中。
我們希望在首頁(yè)上增加暢銷專輯來(lái)增進(jìn)銷售,我們?cè)?HomeController 中增加一下內(nèi)容來(lái)實(shí)現(xiàn),然后增加一些額外的圖片來(lái)變得更好。
首先,在我們的專輯中增加一個(gè)導(dǎo)航屬性,以便與 EF 知道關(guān)聯(lián)的的信息。專輯中最后的一行就是新增加的。
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
public virtual List<OrderDetail> OrderDetails { get; set; }
注意:這里使用了泛型的集合,需要在代碼的前面使用 using 來(lái)引用 System.Collections.Generic 命名空間。
首先,我們將要增加 storeDB 的字段和引用 MusicStore.Models 命名空間,類似于其他的控制器。
然后,我們?cè)?HomeController 中增加下面的方法,來(lái)查詢數(shù)據(jù)庫(kù)根據(jù) OrderDetails 找到暢銷的唱片。
private List<Album> GetTopSellingAlbums(int count)
{
// Group the order details by album and return
// the albums with the highest count
return storeDB.Albums
.OrderByDescending(a => a.OrderDetails.Count())
.Take(count)
.ToList();
}
這是私有方法,因?yàn)槲覀儾幌M苯涌梢栽L問(wèn)到,這里為了簡(jiǎn)單將它寫在了 HomeController 中,實(shí)際開(kāi)發(fā)的時(shí)候,可能需要移到后臺(tái)的邏輯服務(wù)中。
這里,我們更新 Index 來(lái)訪問(wèn)前面定義的方法,查詢銷售前 5 名的專輯,然后將他們傳遞到視圖中。
public ActionResult Index()
{
// Get most popular albums
var albums = GetTopSellingAlbums(5);
return View(albums);
}
完整的代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcMusicStore.Models;
namespace MvcMusicStore.Controllers
{
public class HomeController : Controller
{
private Models.MusicStoreEntities storeDB = new Models.MusicStoreEntities();
//
// GET: /Home/
public ActionResult Index()
{
// Get most popular albums
var albums = GetTopSellingAlbums(5);
return View(albums);
}
private List<Album> GetTopSellingAlbums(int count)
{
// Group the order details by album and return
// the albums with the highest count
return storeDB.Albums
.OrderByDescending(a => a.OrderDetails.Count())
.Take(count)
.ToList();
}
}
}
最后,我們需要更新我們的 Home 控制器的 Index 視圖,訪問(wèn)模型在后面加入專輯的列表,借助這個(gè)時(shí)機(jī),我們還要增加一個(gè)標(biāo)頭和一個(gè)促銷的節(jié)。
@model List<MvcMusicStore.Models.Album>
@{
ViewBag.Title = "ASP.NET MVC Music Store";
}
<div id="promotion">
</div>
<h3>
<em>Fresh</em> off the grill</h3>
<ul id="album-list">
@foreach (var album in Model)
{ <li><a href="@Url.Action("Details","Store",
new { id = album.AlbumId })">
<img alt="@album.Title" src="@album.AlbumArtUrl" />
<span>@album.Title</span> </a></li>
}
</ul>
現(xiàn)在,當(dāng)運(yùn)行程序的時(shí)候,我們將會(huì)看到更新后的主頁(yè),帶有暢銷的專輯和我們的促銷信息。
網(wǎng)站題目:ASP.NETMVC音樂(lè)商店-10.完成導(dǎo)航和站點(diǎn)的設(shè)計(jì)-創(chuàng)新互聯(lián)
文章分享:http://www.rwnh.cn/article28/ceiejp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、虛擬主機(jī)、網(wǎng)站改版、企業(yè)建站、商城網(wǎng)站、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容