1. 程式人生 > >跟我學ASP.NET MVC之八:SportsStrore移動設備

跟我學ASP.NET MVC之八:SportsStrore移動設備

ima 支持 web瀏覽器 css 客戶端瀏覽器 nts oat 重新 menu

摘要:

現在的web程序開發避免不了智能手機和平板電腦上的使用,如果你希望發布你的應用程序給更廣大客戶使用的話,你將要擁抱可移動web瀏覽器的世界。向移動設備用戶發布一個好的使用體驗是很困難的-比只是發布桌面內容要難得多。它需要認真的計劃,設計以及大量的測試。甚至很容易被新的移動設備或平板電腦困住。

MVC框架確實有一些特征幫助移動開發。但是MVC框架是一個服務端框架,接收HTTP請求並發出HTTP響應。你在開發移動客戶端的時候,會碰到很多的困難,而它對這些的作用卻很受限。MVC框架使用不同的移動設備策略,可以幫助到不同層面。有三個基本的你可以使用的移動設備策略,下面將分別介紹它們。

什麽都不做(盡量少地做)

看起來像一個奇怪的主意,但是一些移動設備是能夠處理那些為桌面客戶端開發的內容的。許多的移動設備-不得不承認當今最新的-有高屏幕分辨率,很大的內存,可以快速地呈現HTML以及運行JavaScript。

響應式設計

另一個策略是為適應支持它將顯示的設備,而創建頁面內容。被稱為響應式設計。CSS標準有能力讓你根據設備的性能改變應用在元素上的樣式,它是一個經常被使用的根據屏幕尺寸改變內容的排版的技術。

響應式設計是使用CSS處理的東西,它不直接由MVC框架管理。這篇文章將介紹如何使用Bootstrap庫裏包含的響應式設計,來裝飾SportsStore應用程序。

創建響應式設計的頁面頭部

修改_Layout.cshtml文件。

 1 <!DOCTYPE html>
 2 
 3 <html>
 4 <head>
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <link href="~/Content/bootstrap.css" rel="stylesheet" />
 7     <link href="~/Content/bootstrap-theme.css" rel="stylesheet" />
 8     <
link href="~/Content/ErrorStyles.css" rel="stylesheet" /> 9 <title>@ViewBag.Title</title> 10 <style> 11 .navbar-right { 12 float: right !important; 13 margin-right: 15px; 14 margin-left: 15px; 15 } 16 </style> 17 </head> 18 <body> 19 <div class="navbar navbar-inverse" role="navigation"> 20 <a class="navbar-brand" href="#"> 21 <span class="hidden-xs">SPORTS STORE</span> 22 <div class="visible-xs">SPORTS</div> 23 <div class="visible-xs">STORE</div> 24 </a> 25 @Html.Action("Summary", "Cart") 26 </div> 27 <div class="row panel"> 28 <div id="categories" class="col-xs-3"> 29 @Html.Action("Menu", "Nav") 30 </div> 31 <div class="col-xs-8"> 32 @RenderBody() 33 </div> 34 </div> 35 </body> 36 </html>

我將顯示SPORTS STORE品牌的鏈接,改成了現在這個樣子。

<a class="navbar-brand" href="#">SPORTS STORE</a>

BootStrap使用一種稱為media查詢的方式定義了一系列的樣式,hidden-xx和visible-xx。xx可以使用xs、sm、md、lg代替,分別表示超小屏幕、小屏幕、中等屏幕和大屏幕。

.col-xs- 超小屏幕 手機 (<768px)
.col-sm- 小屏幕 平板 (≥768px)
.col-md- 中等屏幕 桌面顯示器 (≥992px)
.col-lg- 大屏幕 大桌面顯示器 (≥1200px)

這裏使用的是hidden-xs和visible-xs。

hidden-xs:在超小屏幕上隱藏該元素。

visible-xs:在超小屏幕上顯示該元素。

運行程序,在大屏幕尺寸上,頁面內容沒有變化。如果將瀏覽器縮小到小於768px,SPORTS STORE鏈接文字將變成兩行。

技術分享圖片

創建響應式布局的購物車摘要

修改Summary.cshtml文件。

 1 @model SportsStore.Domain.Entities.Cart
 2 
 3 <div class="navbar-right hidden-xs">
 4     @Html.ActionLink("My Cart", "Index", "Cart", new { returnUrl = Request.Url.PathAndQuery }, new { @class = "btn btn-default navbar-btn" })
 5 </div>
 6 <div class="navbar-right visible-xs">
 7     <a href[email protected]("Index", "Cart", new { returnUrl = Request.Url.PathAndQuery }) class="btn btn-default navbar-btn">
 8         <span class="glyphicon glyphicon-shopping-cart"></span>
 9     </a>
10 </div>
11 <div class="navbar-text navbar-right">
12     <b class="hidden-xs">Your cart:</b>
13     @Model.CartLines.Sum(x => x.Quantity) item(s),
14     @Model.ComputeTotalValue().ToString("c")
15 </div>

首先,在不希望在手機屏幕上(<768px)顯示的頁面元素,添加hidden-xs樣式。這樣,這兩個元素在手機屏幕上將不會顯示。

<div class="navbar-right hidden-xs">
    @Html.ActionLink("My Cart", "Index", "Cart", new { returnUrl = Request.Url.PathAndQuery }, new { @class = "btn btn-default navbar-btn" })
</div>

<b class="hidden-xs">Your cart:</b>

然後,為手機屏幕顯示的導航到購物車明細超鏈接,定義自己的樣式。

<div class="navbar-right visible-xs">
    <a href[email protected]("Index", "Cart", new { returnUrl = Request.Url.PathAndQuery }) class="btn btn-default navbar-btn">
        <span class="glyphicon glyphicon-shopping-cart"></span>
    </a>
</div>

這裏直接寫<a></a>元素。因為需要使用<span></span>元素定義超鏈接文字樣式。

class="glyphicon glyphicon-shopping-cart"是定義在BootStrap裏的文字樣式,它將顯示一個小的購物車圖標。

運行程序,在大屏幕尺寸上,頁面內容沒有變化。如果將瀏覽器縮小到小於768px,購物車摘要將顯示成下面截圖那樣的購物車圖標。

技術分享圖片

創建響應式布局的產品列表

在超小屏幕上,左邊的導航菜單占用寬度有點大。我希望在超小屏幕上隱藏左邊的導航菜單,而是將導航菜單做成按鈕組顯示在頁面頭部。

繼續修改_Layout.cshtml文件。

 1 <!DOCTYPE html>
 2 
 3 <html>
 4 <head>
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <link href="~/Content/bootstrap.css" rel="stylesheet" />
 7     <link href="~/Content/bootstrap-theme.css" rel="stylesheet" />
 8     <link href="~/Content/ErrorStyles.css" rel="stylesheet" />
 9     <title>@ViewBag.Title</title>
10     <style>
11         .navbar-right {
12             float: right !important;
13             margin-right: 15px;
14             margin-left: 15px;
15         }
16     </style>
17 </head>
18 <body>
19     <div class="navbar navbar-inverse" role="navigation">
20         <a class="navbar-brand" href="#">
21             <span class="hidden-xs">SPORTS STORE</span>
22             <div class="visible-xs">SPORTS</div>
23             <div class="visible-xs">STORE</div>
24         </a>
25         @Html.Action("Summary", "Cart")
26     </div>
27     <div class="visible-xs">
28        @Html.Action("Menu", "Nav", new { horizontalLayout = true })
29     </div>
30     <div class="row panel">
31         <div id="categories" class="col-sm-4 hidden-xs">
32             @Html.Action("Menu", "Nav")
33         </div>
34         <div class="col-sm-8 col-xs-12">
35             @RenderBody()
36         </div>
37     </div>
38 </body>
39 </html>
  • 首先,修改左邊導航菜單所在的DIV元素樣式,添加hidden-xs,指定它再超小屏幕上不顯示。修改右邊產品列表所在的DIV元素樣式,添加col-xs-12,指定在超小屏幕,寬度上占全部12列顯示。
  • 然後,重新修改在小屏幕以及以上屏幕上,這兩個DIV所占的寬度。col-sm-4指定左邊菜單導航欄占三列。col-sn-8指定右邊產品列表占8列。
  • 最後,使用visible-xs重新定義在超小屏幕上的產品導航欄。它仍舊以DIV顯示,但是他的位置在頁面頭部,所以講他寫到class="row"所在的DIV上面。
  • 向Html.Action方法傳入第三個參數,它是一個動態類型對象,定義了一個自定義屬性horizontalLayout。將修改Menu視圖,在Menu視圖上能夠獲得傳入視圖的動態類型對象的動態屬性值,根據屬性值顯示不同樣式的菜單。

修改Menu.cshtml文件,根據傳入的動態屬性值,顯示不同的菜單樣式

 1 @model IEnumerable<string>
 2 
 3 @{ 
 4  var horizontalLayout = (bool)(ViewContext.RouteData.Values["horizontalLayout"] ?? false);
 5   var wrapperClass = horizontalLayout ? "btn-group btn-group-justified btn-group-md" : null;
 6 }
 7 
 8 <div class=@wrapperClass >
 9     @Html.RouteLink("Home", new { controller = "Product", action = "List" }, new { @class = horizontalLayout ? "btn btn-default btn-sm" : "btn btn-block btn-default btn-lg" })
10     @foreach (var link in Model)
11     {
12         @Html.RouteLink(link, new
13         {
14             controller = "Product",
15             action = "List",
16             category = link,
17             page = 1
18         }, new
19         {
20             @class = (horizontalLayout ? "btn btn-default btn-sm" : ("btn btn-block btn-default btn-lg")) + (link == ViewBag.SelectedCategory ? " btn-primary" : "")
21         })
22     }
23 </div>
  • 通過ViewContext對象,獲得傳入到視圖的動態類型對象ViewContext.RoutData,再通過ViewContext.RoutData.Values這個Dictionary,獲得動態類型對象的動態屬性值。
  • wrapperClass定義了超小屏幕上的按鈕組樣式。如果是超小屏幕,則按新的樣式顯示。否則它的值為null,MVC系統將在頁面上自動刪除這個class屬性(將只顯示成<div>)。
  • 超小屏幕的按鈕組樣式定義:btn-group btn-group-justified btn-group-sm,定義它是一個按鈕組,自動對齊方式以及按鈕組每個按鈕尺寸。
  • 因為超小屏幕上顯示成按鈕組,而不是每個按鈕單獨一行btn-block的按鈕,所有需要重新修改每個按鈕的樣式。使用條件表達式 horizontal?: 重新定義分組按鈕樣式為:btn btn-default btn-sm。與中等屏幕上的按鈕不同的地方是尺寸,以及刪除了btn-block。

運行程序,在大屏幕尺寸上,頁面內容沒有變化。如果將瀏覽器縮小到小於768px,導航菜單將變成下面截圖的頁面這樣。

技術分享圖片

使用針對Mobile的視圖

響應式設計向所有設備發布相同的內容,並使用CSS自己來決定內容怎樣被呈現。這個過程不需要引入服務端部分的代碼,前提是你想使用基本相同的主題對待所有不同的設備。另一個可選的方法是使用服務器端訪問客戶端瀏覽器的功能,向不同的瀏覽器發送不同的HTML。如果你計劃發送和桌面客戶端完全不同的應用程序頁面,這樣做很方便。

MVC框架支持一個名叫顯示模式的ASP.NET框架功能,它讓你根據發送請求的客戶端,創建不同的視圖。這篇文章不打算介紹它了,讀者可以搜索更多的文章對它進行完整的介紹。

跟我學ASP.NET MVC之八:SportsStrore移動設備