1. 程式人生 > >ASP.net Mvc SportsSpore專案開發(二)

ASP.net Mvc SportsSpore專案開發(二)

1.新增導航控制元件

為了使客戶能通過產品分類對其進行導航,需要從三面著手:

1)增強Product Controller類中的List動作模型,以使它能夠過濾儲存庫中的Product物件。

2)重新檢查並增強URL方案,並且修改路由配置。

3)   建立一個產品分類列表,將其放入網站工具欄,高亮顯示當前分類,並對其他分類進行連結。

2.過濾產品列表

首先從強型別檢視模型ProductsListViewModel開始,為了渲染工具欄,需要將當前分類傳遞給檢視。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SportsStore.Domain.Entities;

namespace SportsStore.WebUI.Models
{
    public class ProductsListViewModel
    {
        public IEnumerable<Product> Products { get; set; }
        public PagingInfo PagingInfo { get; set; }
        public string CurrentCategory { get; set; }
    }
}

添加了一個新的屬性CurrentCategory。

更新Product控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Entities;
using SportsStore.WebUI.Models;

namespace SportsStore.WebUI.Controllers
{
    public class ProductController : Controller
    {
        private IProductsRepository repository;
        public int PageSize = 2;
        public ProductController(IProductsRepository productRepository)
        {
            this.repository = productRepository;
        }
        public ViewResult List(string category,int page = 1)
        {
            ProductsListViewModel model = new ProductsListViewModel
            {
                Products = repository.Products.Where(p => category == null || p.Category == category).OrderBy(p => p.ProductID).Skip((page - 1) * PageSize).Take(PageSize),
                PagingInfo = new PagingInfo
                {
                    CurrentPage = page,
                    ItemsPerPage = PageSize,
                    TotalItems = repository.Products.Count()
                },
                CurrentCategory = category
            };
            return View(model);
        } 
    }
}

更新路由,使其更加強大完善。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace SportsStore.WebUI
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(null,"",
                new { controller = "Product", action = "List", category = (string)null, page = 1 }
                );
            routes.MapRoute(null, "Page{page}", new { controller = "Product", action = "List", category = (string)null },
                new {
[email protected]
"\d+"} ); routes.MapRoute(null, "{category}", new { controller = "Product", action = "List", page = 1 }); routes.MapRoute(null, "{category}/Page{page}", new { controller = "Product", action = "List" }, new { page = @"\d+" } ); routes.MapRoute(null, "{controller}/{action}"); } } }

Mvc用Asp.net的路由系統處理來自於客戶端的輸入請求,但也用它生成輸出URL,這種輸出URL符合URL方案,並可以嵌入到Web頁面之中。通過路由系統處理輸入請求並生成輸出URL,可以確保應用程式中的所有URL是一致的。

Url.Action方法使生成輸出連結最方便的方法。

更新List.cshtml檔案:

@model SportsStore.WebUI.Models.ProductsListViewModel
    @{
        ViewBag.Title = "Products";
    }
    @foreach (var p in Model.Products)
    {
        @Html.Partial("ProductSummary",p)
    }
    <div class="btn-group pull-right">
        @Html.PageLinks(Model.PagingInfo,x=>Url.Action("List",new { page = x,category = Model.CurrentCategory}))
    </div>

在修改之前生成的URL是:http://<伺服器>:<埠號>/Page1

這樣的頁面連結,分類過濾不會起作用。

修改後:http://<伺服器>:<埠號>/Chess/Page1

當用戶點選連結時,當前分類會被傳遞給List動作方法,就可以看到頁面底部的連結會正確的包含分類資訊。

3.建立分類導航選單

Asp.net MVC框架具有一種叫做“子動作”的概念,特別適用於建立諸如可重用導航控制元件的情況。子動作依賴於叫做“Html.Action”的HTML輔助器方法,它讓你能夠在當前檢視中包含一個任意動作方法的輸出。

在Controllers資料夾下建立一個新的控制器:NavController

同時新增一個Menu動作方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SportsStore.Domain.Abstract;

namespace SportsStore.WebUI.Controllers
{
    public class NavController : Controller
    {
        private IProductsRepository repository;
        public NavController(IProductsRepository repo)
        {//新增一個構造器實現IProductsRepository介面
            repository = repo;
        }
        // GET: NavController
        public PartialViewResult Menu(string category = null)
        {//從資料庫獲取分類列表,此控制器使用的是一個分部檢視,所以在動作方法中呼叫了PartialView
            ViewBag.SelectedCategories = category;
            IEnumerable<string> categories = repository.Products.Select(x => x.Category).Distinct().OrderBy(x => x);
            return PartialView(categories);
        }

    }
}

在佈局頁渲染這個子動作,而不是在一個特定的檢視中進行渲染。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />

    <title>@ViewBag.Title</title>
    <link href="~/Content/bootstrap.css" rel="stylesheet"/>
    <link href="~/Content/bootstrap-theme.css" rel="stylesheet" />
</head>
<body>
    <div class="navbar navbar-inverse" role="navigation">
        <a class="navbar-brand" href="#">Sports Store</a>
    </div>
    <div class="row panel">
        <div id="categories"class="col-xs-3">
            @Html.Action("Menu", "Nav")
        </div>
        <div class="col-xs-8">
            @RenderBody()
        </div>
    </div>
    
</body>
</html>

建立檢視,在Menu動作方法上右擊新增檢視,

model IEnumerable<string>

@Html.ActionLink("Home", "List", "Product", null, new { @class = "btn btn-block btn-default btn-lg" })
@foreach (var link in Model)
{
    @Html.RouteLink(link, new
{
    controller = "Product",
    action = "List",
    category = link,
    page = 1
}, new
{
    @class = "btn btn-block btn-default btn-lg" + (link == ViewBag.SelectedCategory ? "btn-primary" : "")
})
}

添加了一個Home連結,在無分類過濾下列舉所有產品。

修改頁面的計數,目前過濾實現了,但是每類產品所包含的總數確實沒有變的,因此會有冗餘頁面。

修改ProductController檔案

public ViewResult List(string category,int page = 1)
        {
            ProductsListViewModel model = new ProductsListViewModel
            {
                Products = repository.Products.Where(p => category == null || p.Category == category).OrderBy(p => p.ProductID).Skip((page - 1) * PageSize).Take(PageSize),
                PagingInfo = new PagingInfo
                {
                    CurrentPage = page,
                    ItemsPerPage = PageSize,
                    TotalItems = category == null ? repository.Products.Count() : repository.Products.Where(e => e.Category == category).Count()
                },
                CurrentCategory = category
            };
            return View(model);
        } 

執行效果圖:


相關推薦

ASP.net Mvc SportsSpore專案開發(

1.新增導航控制元件為了使客戶能通過產品分類對其進行導航,需要從三面著手:1)增強Product Controller類中的List動作模型,以使它能夠過濾儲存庫中的Product物件。2)重新檢查並增強URL方案,並且修改路由配置。3)   建立一個產品分類列表,將其放入網

ASP.net Mvc SportsSpore專案開發(四

1.使用模型繫結MVC框架使用了一個叫做“模型繫結”的系統,以便通過HTTP請求來建立一些C#物件,目的是將它們作為引數值傳遞給動作方法。這是MVC 處理表單的方式。例如,框架會考查目標動作方法的引數,用一個模型繫結器來獲取由瀏覽器傳送過來的表單值,並在傳遞給動作方法之前將它

ASP.net Mvc SportsSpore專案開發(五

1.新增分類管理此次需要實現的是對物品資訊的讀取,新增更新和刪除的操作。這些動作統稱為“CRUD”。建立CRUD控制器,在Controllers檔案下新增控制器AdminControllerusing System; using System.Collections.Gene

asp.net mvc 模組化開發第一章(平臺介紹

基本框架是平臺+模組,其實說實在我也不知道這算框架還是算設計,或者說什麼都不算,希望大神們不要見笑,暫且我們叫他框架吧?這種框架源自於我上一家公司,當時我們公司有一個建站平臺和大家現在用CMS系統很像,不過功能沒有那麼強大,但是非常實用。這個平臺我用了將近三年,給我最大的感受

使用Visual Studio 2015 開發ASP.NET MVC 5 專案部署到Mono/Jexus

最新的Mono 4.4已經支援執行asp.net mvc5專案,有的同學聽了這句話就興高采烈的拿起Visual Studio 2015建立了一個mvc 5的專案,然後部署到Mono上,瀏覽下發現一堆錯誤出現,心中一萬隻草泥馬奔騰而來,這也叫支援嗎,這個問題是Visual Studio造成的,不相信的話可以使用

ASP.NET MVC搭建專案後臺UI框架—6、客戶管理(新增、修改、查詢、分頁

目錄 接著之前未寫完的繼續,本篇,我將講解在此UI框架中和ASP.NET MVC4進行結合開發。效果如下: 這裡,我將新增和修改用了兩個不同的檢視,當然也可以把新增和修改放到同一個檢視中,但是要寫一些業務邏輯程式碼來區分當前呼叫的是修改還是新增,根據新增和修改的不同,而對介面進行不同的操作。 新

ASP.NET MVC企業實戰》() MVC開發前奏

​ 在上一篇“《ASP.NET MVC企業級實戰》(一)MVC開發前奏”中記錄了作者介紹的一些比較實用的VS使用方法以及C#2.0中新增的新特性。本篇繼續大概瞭解之後版本的一些新特性。 一、C#3.0/3.5新特性 a)自動屬性 屬性的目的是為了封裝欄位和控制對欄位的讀寫

ASP.NET MVC模組化開發——動態掛載外部專案

最近在開發一個MVC框架,開發過程中考慮到以後開發依託於框架的專案,為了框架的維護更新升級,程式碼肯定要和具體的業務工程分割開來,所以需要解決業務工程掛載在框架工程的問題,MVC與傳統的ASP.NET不同,WebForm專案只需要掛在虛擬目錄拷貝dll就可以訪問,但是MVC不可能去引用工程專案的dll重新編譯

從零開始構建一個的asp.net Core 項目(

mage .... cfi web execute 運行 figure 今天 deb 接著上一篇博客繼續進行。上一篇博客只是顯示了簡單的MVC視圖頁,這篇博客接著進行,連接上數據庫,進行簡單的CRUD。 首先我在Controllers文件夾點擊右鍵,添加->控制器 彈

.net異步性能測試(包括ASP.NET MVC WebAPI異步方法

睡眠時間 問題 none seconds await 數字 val http httpget 很久沒有寫博客了,今年做的產品公司這兩天剛剛開了發布會,稍微清閑下來,想想我們做的產品還有沒有性能優化空間,於是想到了.Net的異步可以優化性能,但到底能夠提升多大的比例呢?恰好有

asp.net mvc+jquery easyui開發實戰教程之網站後臺管理系統開發2-Model層建立

ack 前端 strong syn eee 名稱 lar led tegra 上篇(asp.net mvc+jquery easyui開發實戰教程之網站後臺管理系統開發1-準備工作)文章講解了開發過程中的準備工作,主要創建了項目數據庫及項目,本文主要講解項目M層的實現,M層

Asp.net MVC 中 CodeFirst 開發模式例項

  昨天寫的這篇部落格因為下班時間到了忘記儲存了,好鬱悶,得重新寫一遍。實習所在公司使用的是CodeFirst開發模式,最近開始參與到公司的專案裡面來了,發現這個模式特別好用,建庫建表改變欄位屬性新增刪除欄位等等操作都無需自己在資料庫動手操作,只需要編寫程式碼即可實現,著實是方便了許多。今天來記錄一下如何使用

ASP.Net MVC OA專案筆記<六>

1.1.1 開始寫業務,先寫業務的實現再寫業務的介面          業務類中也是有寫增刪改查公用的方法          引用Model,IDAL,DALFactory     &

如何提高碼農產量,基於ASP.NET MVC的敏捷開發框架開發隨筆一

公司業務量比較大,接了很多專案,為了縮短開發週期老闆讓我牽頭搭建了一個敏捷開發框架。 我們主要的業務是做OA、CRM、ERP一類的管理系統,一個通用的後臺搭出來,再配合一些快速開發的元件開發效率能提高很多。 另外老闆一再強調要支援APP開發,一次開發能部署到安卓和IOS上。

asp.net mvc3 資料驗證(——錯誤資訊的自定義及其本地化

一、自定義錯誤資訊         在上一篇文章中所做的驗證,在介面上提示的資訊都是系統自帶的,有些讀起來比較生硬。比如: ;         如果你的環境是英文的,那麼你的提示資訊就是中英文夾雜的了。         在這種情況下就需要用到自定義錯誤資訊

ASP.NET之旅--淺談Asp.net的執行機制(

      上節中我們從Http請求在Asp.net中的執行過程進行了分析,但是對於真正核心的東西我們並沒有說明,那接下來我們將問題上拋,從底層類和物件的建立層面上來看Asp.net的執行機制。 三、Asp.net底層執行機制    1、理解HTTP.SYS      

Asp.net mvc 知多少(一

本節主要講解MVC的基本概念 Q1. 什麼是MVC? Ans. MVC是Model-View-Controller的簡稱。它是在1970年引入的軟體設計模式。MVC 模式強迫關注分離 — 域模型和控制器邏輯與UI是鬆耦合關係。從而使應用程式的維護和測試更加簡單容易。 Q2. 解釋一下MVC設計模式? A

ASP.NET MVC分頁庫()【使用示例】

昨天,我的人生朝一個方向前進;而今天卻朝著另一個方向。昨天,我相信我不可能做的事;今天,我卻做了。 專案結構: 實體類: public class Product { public string Name

ASP.NET MVC搭建專案後臺UI框架—1、後臺主框架

目錄 準備做一個新的專案,從網頁設計師手中拿到了html靜態頁面(沒有一行js),但是都一個個零散的介面,我需要做的是: 1、  把這些零散的html介面連線起來 2、  自己編寫js或者jquery實現選單效果 3、  把html頁面整合在我們的MVC Razor檢視中 本想著使用第三方的UI

ASP.NET MVC搭建專案後臺UI框架—8、將View中選擇的資料行中的部分資料傳入到Controller中

目錄 現在,有一個需求,我需要將表格中選中行的資料中的一部分傳直接傳到控制器中,然後儲存到另外一張表中。一開始,我就想到在前臺使用ajax構造json資料,然後控制器直接通過list接收。 選中介面中的行,然後點選“批量新增到月結表”,彈出一個對話方塊,這個對話方塊的月份列表為當前選擇資料行中