mnc音樂商店學習筆記

http://mvcmusicstore.codeplex.com/有文檔
思勝mvc3 音樂商店項目視頻1 
新建項目時 要用C#方式 否則medels下新建的會是vb文件而不是cs文件
------------------------------------項目紹--------------------------------------------------
新建 項目 web  mvc3web應用程序 空的  html5
約定勝於配置 
  控制器後綴爲control,不可更改
mvc  存放什麼東西
   控制器後綴爲control 存放方法
   models  存放定義數據庫的數據的類
   view 存放界面 


在controls 添加 控制器  hellowordcontrols
  在gloabl.asax.cs  裏面有設置默認的home 和默認的index方法
新建storecontroller
  3個方法
  index()  return "這裏是index()";
  browse()  return "..."
  details()   ....
傳參數:
  browse(string gene)
  {
     string message=HttpUtility.HtmlEncode("store.browse,gene="+gene);
     return message;  
  }
穿整數
 details(int id)
 {
   string message="store.browse,id="+id;
     return message;
 }


home/index  hemel控制器的index方法
store/details/5 


HttpUtility.HtmlEncode用的是xx?xx=5
普通字符串是store/details/5


---------------------------------------視頻2視圖和模型-----------------------------------------------
return this.view();
添加視圖名稱默認和方法的名稱是一樣的
試圖引擎始終選擇 razor
不使用佈局和模版頁
增加了views 下的home 下的 index.cshtml 由homel控制器下的index方法使用


在shared文件夾下有viewstart.cshtml打開
裏面設置了 佈局爲默認使用layout.cshtml的格式
運行 看到index 但是查看源代碼就可以看到格式


可以刪除layoyut.cshtml的內容 使用自定義的新的模板頁


自定義的新的模板頁的內容爲
<!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>ASP.NET MVC MUSIC STORE</h1>
        <ul id="navlist">
            <li class="first"><a href="/" id="current">Home</a></li>
            <li><a href="/Store">Store</a></li>
        </ul>        
    </div>


    <div id="main">
        @RenderBody()
    </div>


    <div id="footer">
        built with <a href="/">ASP.NET MVC 3</a>
    </div>


</body>
</html>


美工不好,修改美工


覆蓋content文件夾  來存放自定義的圖片和樣式表


public string details(int id)
{
string message="store,details,id="+id;
}
public string browse(string genre)
{
string messsage=HttpUtility.HtmlEncode("store.browse,genre="+genre);
return message;
}
使用此方法預處理用戶的輸入,這些能阻止用戶向視圖中用連接注入js或者html標記
比如store/browse?genre=<scpipt>window.location="www."></>


添加新models  流派類 genre.cs
public string name{get;set;}
添加新類 專輯類 album
public string title{..}
 對象屬性,表示專輯屬於哪一類(搖滾。傷感,回憶)     
 punlic      genre genre{..}




public ActionResult Details(int id)
        {
            //定義變量
            var album = new Album {title = "Album " + id };
            //轉到視圖
            return View(album);
        }
var表示定義變量,var可以不知道變量什麼類型,編譯器會把等號右邊的類型
賦給var
添加視圖 使用佈局


@model 傳過來的模型是什麼類型的
@model musicstoreproject.models.album;
<h2>專輯的標題:@model.title</h2>




強類型  。。。models
details(string genre)
var model=new genre(){name=genre};
return this.view(model);




修改主方法爲public actionresult inex()
{
vargenres=new list<genre>
{
 new genre{name="111"},
 new genre{name="111"},
 new genre{name="111"}
}





添加視圖 顯示全部的數據
集合對象 傳遞了許多個 genre對象
強類型  支持的框架模版 選擇list 使用模版
@model IEnumer。。。。等等底下的以及edit 等都是自動生成的




@model.count 個數
《ul》
  @foreach(var genre in model)
  {
    //<li>@genre.name</li>讀取列表的名字
    //增加頁面之間的鏈接
    《li><a href='/store/[email protected]'>@genre.name</li>
  }
</ul>


在browse.html添加回到首頁的超鏈接
@html.Actionlink("回到首頁","index");回到首頁 即index方法


和<a href='/store/[email protected]'>@genre.name</li>作用一樣
@html.Actionlink("提示內容","action方法名",new {genre=genre.name});給方法傳遞的參數 匿名對象


-------------------------------數據訪問---------------------------------------------------------
對性關係映射技術 
安裝ef 4.1
安裝ef後會在引用文件中找到該ef程序集。。。.dll
我們將使用ef支持進行查詢和更新數據庫中的數據
ef是一個靈活的進行數據訪問的對象關係映射api,允許開發人員使用面向對象的幹事對數據庫中的數據進行查詢和更新


新建類 artist藝術家類
屬性2個 artistId{..}
        name
ef約定1:類名加Id或者Id將會ef被自動設置爲主鍵


增加專輯的album的內容
albumid  專輯id
genreid
artistid
title
price
albumarturl
genre
artist 
ef約定2:有藝術家類的屬性,則會自動創建主外鍵的關聯


更新genre的內容
genreid
name
description
public list<album> albums{get;set;}
因爲有集合 所以會有主外鍵的關聯。


 


在webconfig的configuration中添加連接串
名稱是自己起的 鏈接字符串  使用哪種數據庫
<connectionStrings>
    <add name="MusicStoreEntities"
    connectionString="server=.;database=musicstore;uid=sa;pwd=123"
    providerName="System.Data.SqlClient"/>
  </connectionStrings>




添加新類的名字和字符串名字一樣 MusicStoreEntities:DbContext
DbContext數據庫上下文  using命名空間不報錯
泛型的 對應數據庫中的表名一樣
public Dbset<album> albums{get;set;}
genre         genres
artist        artists


---------------------下面開始添加數據
複製sampledata.cs到models下面
添加新的類,往數據庫中添加數據 sampledata:DropCreatedatabaseIfModelChanges<musicstoreentities>
發現模型變化了,則刪除並重建數據庫
seed()重寫基類的方法以提供樣本數據


actionstart()當程序第一次被訪問時,會執行的方法
添加進去一句話
system.data.entity.database.setInitializer(new mvcmusicstore.models.sampledata());
纔可以每次都在檢測模型變化後重建數據庫




------------------查詢數據庫的的的話
在控制器store中
用於訪問數據庫的私有成員
private musicstoreentities storedb=new musicstoreentities();




更新indexaction查詢數據庫爲
var genres=soredb.genres.tolist();
return this.view(genres);


查看數據庫的話 多了一張額外的表來跟蹤對錶的修改
在數據庫的 數據庫關係圖 確定  右鍵 新建數據庫關係圖
關係圖  選擇三張表 添加


----------修改storecontroller的browse(string genre)方法爲
var genermodel=storedb.genres
.include("albums")  提前加載 分類裏面的唱片的集合
.single(g=>g.name==genre);分類 找genres的genre=genre的分類
return this.view(genremodel)


---------修改browse.cshtml爲:
添加
<h2>browseing genre:@model.name</h2>
<ul>@foreach(var album in model.albums)
{
 <li>@html.actionlin(album.title,"details",new{id=album.albumid} )@album.title</li>
}</ul>


------------修改details(int id)方法
找到指定id的  details
var album=storedb.albums.find(id)
return this..view(album);


至此,可以看到效果爲:看到整個流派,每個流派的列表,每個列表的詳情等


-------------------------通過支架創建編輯表單------------------------------------
按f12  把。。。文本修改爲ie8標準


創建storemanger控制器  支架爲:包含讀寫操作和視圖的控制器使用ef
模型類用 album
數據上下文類爲: musicstoreentities(mspm)
添加


-----------------下面開始解析storemanger控制器
create創建新專輯 post 和get 用【httppost】來區別 
dispose回收資源 deleteconfirmed確認刪除


index方法  找到視圖 idnex。cshtml
刪除<tr><td>albumurl</td></tr>
刪除@html....
則刪除了藝術家的那一列


火狐瀏覽器 firebug
 jquery-1.4.4.min.js沒有拿到
找到模板頁lauout.cshtml將其修改爲1.5.1.min.js即可正常edit


----------開始介紹create
create參數類型是專輯的類型  
模型綁定 參數爲:自動創建一個空的模型對象
isvalid  檢查合格
     add添加到數據庫
     savechanges()寫入數據庫
     redirecttoaction("方法名")重定向到主頁面


若檢查不合格 則返回原來的添加界面
SelectList(IEnumerable, String, String, Object) 使用列表的指定項、數據值字段、
數據文本字段和默認選定的值   來初始化 SelectList 類的新實例。
參數爲:列表的數據來源 列表的名稱 顯示的內容  默認選中是誰,默認選中它上次選擇的添加的字段值


viewbag 課添加任何屬性,任何名稱 向視圖傳遞多個信息 可添加任何屬性
@model.。。只能是一個 viewbag可傳遞多個值
向視圖:傳遞2個下拉列表數據 +一個模型


使用htmlhelp 顯示下拉列表
@html.dropdowmlist 參數 (從哪裏獲取顯示用的列表, 哪一個值需要被預先選中)
第一個參數先從模型對象找值,找不到再從其他帶的model帶的找


創建時 默認沒有選中的 所以下拉列表默認沒有選中任何東西 string empty
修改時 默認選中了


----------------編輯edit
刪除 delete  直接刪除
【post,解決同名的問題的anctionname[delete]】
deleteconfirmed 刪除的確認


dispose回收資源
通過[httppost]進行標註 是post還是get的
[httppost,actionname("name")]指定anction的實際名字 方法名字和action名字不一樣




使用自定義lhelper截斷長字符的方法
@helper truncate(string input,int length)
{
 if(input.lentgh<=length){@input}
 else {@input.substring(0,lentgh)<text>...</text>}
}
添加到indx.cshtml的第二行
在代碼使用方法
修改<td>@html.displayfor(....)爲  <td>@truncate(item.Artist.title,25)</td>




添加文件夾helpers  添加類 htmlhelps
此函數添加在裏面可以方便很多頁面都是用截取字符串的方法
using system.web.mvc;           this+ 被擴展的對象 +helper
public static string truncate(this.htmlhelper helper,string input,int length)
{
 if(input.lentgh<=length){@input}
 else {@input.Substring(0,lentgh)<text>...</text方法,


必須引入視圖
防止每個視圖都using 在配置文件頁面使用此方法必須引入空間
@using musicstroe.helpers; 
<td>@html.trucncate(viewbag.message as string ,8)</td>
或者 <td>@tuuncate(item.Artist.title,25)</td>


至此,對數據庫的增刪改查都已經做到了
------------------------------通過特性進行驗證----------------------------------------------------
寫的代碼類去創建的數據庫 所以是代碼優先 code-first
在genre類裏面寫的類 public strign description與數據庫的字段一樣


下面瞭解什麼是 代碼優先 數據庫優先  模型優先




---------------------------------數據庫優先
新建項目 
在數據庫中添加表 
vs2012 新建 數據 ado.net實體數據模型 musicstore.edmx
從數據庫生成 數據庫是新的 新建連接 使用sql server身份驗證  測試連接 
選擇新建的數據庫  確定  下一步  表 打鉤 完成




-----------------------------模型優先
添加新建  ado.net實體模型   musicstore.edmx  
空模型,而不是從數據庫生成等
拖拽“實體”  郵件 添加屬性等




爲專輯表單增加模型驗證
在命名空間 system.componentModel.DataAnnotation;
required 必須提供內容
displayname 顯示名- 定義表單字段的提示名稱
stringlength  字符串長度
range  範圍
bind 綁定 列出請求半數綁定到模型時 包含和不包含的字段
scaffoldcolumn  支架咧 在 編輯表單的時候 需要隱藏起來的字符




原來的專輯頁面是沒有檢查的,修改如下
using system.componentmodel.DataAnnotation;


[Bind(Exclude="albumid")]
public class album
{
  [scaffoldcolumn(face)]
  pulic int alubmid(get;set;)
   
  [displayname[artist]] public int artistid{..}
  
  [required(errormessage="錯誤信息提示")]
  [stringlengrh(16)]
   //文本字段可以不生成全部是varcharmax長度的了
   //可以檢測用戶輸入的合法性
  public string title{get;set}
  
  [range(1,100,errormassage="ssss")]
  
  [displayname("顯示在界面上的第一行的名稱")]


  [scaffoldcolumn(false)]支架生成視圖時,不考慮albumid列
  pulic int albumnid{set;get}
  
  [bind(exclude="alumid")]數據綁定 不考慮專輯的id的屬性
 }


發現數據庫被代碼修改後 會刪除並自動重建 速度比較慢 但是數據庫界面不用使用及修改


labelfor(model=>model.albimurl)爲它生成顯示的標籤,默認和屬性同名
displayfor


使用jquery客戶端腳本驗證,有錯誤,重新改正之後,錯誤提示立馬消失


web.config中有 不明顯的javascript方式啓用
               客戶端驗證 啓用


-----------------------------------07成員管理和權---------------
任何人都可以進行增上改查,也不用接觸到數據庫
在framework v4.0中找到 asp.net_regsql.exe
工具幫助我們在數據庫創建會員管理表 
C:\Windows\Microsoft.NET\Framework\v4.0.30319 找到 雙擊  啓動
配置(第一個) 下一步 選擇數據庫 下一步 確認


刷新頁面 可看到數據庫中增多了許多表
用戶表 角色表等
在web.config中配置 成員管理的使用


machine.config  web.config    你的項目裏面的web.config優先級升高,可覆蓋


C:\Windows\Microsoft.NET\Framework64\v4.0.30319 \ config文件夾下的web.config  網站用到的參數
machine.config  所有的配置參數適用於所有的.net


打開machine.config找到name="AspNetSqlMembershipProvider"


membership>
<providers>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
</providers>
</membership>


複製到當前目錄下的web.config
找到name="aspnetsqlroleprovider"
複製到當前目錄下的web.config
不希望使用app_data文件夾下的數據庫 所以把connectionstringname=".."替換爲""
musicstoreentities;再把前面的配置刪除掉
 <clear>  在<add前面加
密碼長度至少爲7 
非數字或者字母的其他字符至少有一個 


以前的清除  加上enable=""true




打開項目 最後一項asp.net配置
打開安全 可以再此處創建用戶 創建和管理角色等
添加之後可以再數據庫中看到添加的結果


另一種配置方法 右鍵 重新建一個項目otherstore
internet應用程序 確定 生成了一個網站項目 
在此web.config中已生成了許多配置 \複製沒有的到web.config


沒有的是
<profile>




在此處還生成了用戶創建界面
accountctrooler.cs 複製到controllers裏面 修改命名空間
accountmodels.cs也複製到models裏面 修改命名空間
添加account文件夾到views文件夾下


先創建角色,再創建用戶,併爲用戶選擇角色adminstrator
在storemanger頁面中加入【authorize(role="adminstrator")】
即可限制用戶的訪問後臺數據管理界面
-------------------------------------------購物車-------------
--------------數據庫05掛接上來搭建到08上
數據庫,附加數據庫
報錯,拒絕訪問
複製路徑 到文件夾 點擊 繼續 找到文件
點擊屬性 安全 繼續
添加 立即查找 users
可以訪問 允許 
按此方法也修改日誌文件


手動刪除數據庫的時候要關閉現有鏈接,否則會等待操作完成後才刪除


models下新建類cart


using system,compoentmodel.data...
【key】說明了 recordid爲此表的主鍵
pulic int recordid{...}
cartid 區分不同的購物車
albumid專輯的id
count
datacreated
pulic virtual album album{}通過專輯對象 知道專輯多少錢 什麼名


models添加orderdetail類
public int orderdetailid
 int orderid
int albumid
int quality
public decimal unitprice
pulic virtual album album{get;set;}
public virtual order order{..}




models添加order類
int orderid
string username
firstname
lastname
address
city
state
postalcode
country
phone
email
total
orderdate
pulic  list<oederdetail>orderdetails{get;set;}


下面把我們的musicstoreentities更新 來往數據庫中添加表
添加 pulic Dbset<car>cars{get;set;}
publc DbSet<order>orders{}
orderdetail>orderdetails{setl;get;}


下面 我們在models文件夾創建shoppingcar類 處理cart類的數據訪問
 另外 它還需要處理在購物車中增加或者刪除項目的業務邏輯
shoppingcart提供如下方法:
addtocart 將專輯作爲參數添加到購物車
removefromcart 通過專輯的表示從用戶的購物車將這個專輯的數量減1
emptycart 刪除用戶的所有項目
getcartitems 獲取購物項目的列表用來顯示或者處理
getcount 獲取用戶中專輯的數量
gettotal總價
createorder 將購物車轉化爲結賬過程中的訂單
getcar 靜態的方法 獲取用戶的購物車對象 它使用getcartid方法類讀取保存當前session中的購物車標示
getcarid方法需要httpcontextbase以便獲取當前的session


詳細的介紹此類要看代碼中


創建視圖模型文件夾
創建視圖模型類 shoppingcartviewmodel
創建shoppingcartremovemodel


---------創建index。cshtml
@model MvcMusicStore.ViewModels.ShoppingCartViewModel
@{
    ViewBag.Title = "Shopping Cart";
}
<script src="/Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(function () {
        // Document.ready -> link up remove event handler
       -------點擊了calss爲這個的元素時
        $(".RemoveLink").click(function () {
            // Get the id from the link
            -------$(this).attr(key); 獲取節點屬性名的值,相當於getAttribute(key)方法
詳細出處參考:http://www.jb51.net/article/41922.htm
            var recordToDelete = $(this).attr("data-id");


            if (recordToDelete != '') {


                // 去RemoveFromCart方法裏面傳參數id=recordToDelete 
                $.post("/ShoppingCart/RemoveFromCart", { "id": recordToDelete },
                    function (data) {
                        // Successful requests get here
                        // Update the page elements
                        if (data.ItemCount == 0) {
=0  找到這一行 慢點 刪除掉
                            $('#row-' + data.DeleteId).fadeOut('slow');
                        } else {
                            修改元素的text
                            $('#item-count-' + data.DeleteId).text(data.ItemCount);
                        }
                       修改頁面中元素的總價 提示信息 數量等信息
                        $('#cart-total').text(data.CartTotal);
                        $('#update-message').text(data.Message);
                        $('#cart-status').text('Cart (' + data.CartCount + ')');
                    });
            }
        });


    });




    function handleUpdate() {
        // Load and deserialize the returned JSON data
        var json = context.get_data();
        var data = Sys.Serialization.JavaScriptSerializer.deserialize(json);


        // Update the page elements
        if (data.ItemCount == 0) {
            $('#row-' + data.DeleteId).fadeOut('slow');
        } else {
            $('#item-count-' + data.DeleteId).text(data.ItemCount);
        }


        $('#cart-total').text(data.CartTotal);
        $('#update-message').text(data.Message);
        $('#cart-status').text('Cart (' + data.CartCount + ')');
    }
</script>
<h3>
    <em>Review</em> your cart:
</h3>
<p class="button">
    @Html.ActionLink("Checkout >>", "AddressAndPayment", "Checkout")
</p>
<div id="update-message">
</div>
<table>
    <tr>
        <th>
            Album Name
        </th>
        <th>
            Each Price 
        </th>
        <th>
            Quantity
        </th>
        <th>Operating</th>
    </tr>


    @foreach (var item in Model.CartItems)
    {
        <tr id="[email protected]">
            <td>
參數爲提示(顯示)信息 方法名稱 控制器名稱 參數
                @Html.ActionLink(item.Album.Title, "Details", "Store", new { id = item.AlbumId }, null)
            </td>
            <td>
                @item.Album.Price
            </td>
            <td id="[email protected]">
                @item.Count
            </td>


            <td>
data-id 是用於取id的元素空間,可以自己自定義
                <a href="#" class="RemoveLink" data-id="@item.RecordId">Remove from cart</a>
            </td>


        </tr>
    }
    顯示的最後一行
    <tr>
        <td>
            Total
        </td>
        <td>
        </td>
        <td>
        </td>
       這個模型就2個參數 1個是CartTotal 另一個是cartitems
        <td id="cart-total">
            @Model.CartTotal
        </td>
    </tr>


</table>








----------修改details頁面
@model 音樂商店.Models.Album
@{
    ViewBag.Title = "Details";
}


<h2>Album: @Model.Title</h2>
<p>
<img alt="@Model.Title" src="@Model.AlbumArtUrl" />
</p>


<div id="album-details">


 <p><em>Genre:</em>@Model.Genre.Name</p>
 <p><em>Artist:</em>@Model.Artist.Name</p>
  <p><em>Price:</em>@String.Formate("{0:F}",model.Price)</p>


<p class="button">
//參數爲提示信息 方法名稱 控制器名稱 參數
@Html.ActionLink("add to cart","AddTocart","ShoppingCart",new {id=model.AlbumId},"")</p>


</div>


至此,瀏覽,詳情 加入購物車 成功
退出去再買一個數量變成2了
刪除,變成1,再刪除,慢慢的消失了


---------------------------------------------註冊完和結賬-=====----
控制器account
private void MigrateShoppingCart(string UserName)
        {
            //取得購物車
            var cart = ShoppingCart.GetCart(this.HttpContext);
            //更換所有人
            cart.MigrateCart(UserName);
            //保存當前的用戶名爲購物車標示
            Session[ShoppingCart.CartSessionKey] = UserName;
        }
用戶登陸之後 新註冊之後 調用此方法


在account中logon()添加一句  
migrteshoppingcart(model.username) 一旦用戶成功登陸 則合併購物車
register(..)添加一句  migrteshoppingcart(model.username)


添加結賬checkout控制器
空的
讓用戶登陸之後才能結賬 所以由語句 [authorize]


 <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    </authentication>
   因爲webdonfig中有驗證方式 loginurl設置了登陸頁面的url




addressandpayment(post)驗證用戶的輸入信息
addressandpayment(get)顯示賬單


[httppost]
actionresult addresspsyment( formcollection values)
formcollection 拿到用戶的表單數據集合
訂單是一個對象 所以new order
通過模型綁定將請求參數綁定到模型對象上 tryuodatemodel(oder)
模型中會記錄那個數據不匹配
忽略大小寫判斷字符穿是否相當 返回頁面 看見已經填寫的信息以及記錄的錯誤信息
填對了則成訂單
保存訂單
保存訂單的明細   分爲{得到購物車 將訂單轉化爲賬單 轉到新的、action}


complete(..)完成訂單之後要的提示
view 傳的是字符串的話 則會當做視圖名稱


@model 音樂商店.Models.Order


@{
    ViewBag.Title = "AddressAndPayment";
}


<h2>AddressAndPayment</h2>


<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>


修改頁面
@model 音樂商店.Models.Order


@{
    ViewBag.Title = "Address And Payment";
}


<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>


@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>有一組
        <legend>Order</legend>這一組的標題


         @Html.EditorForModel()
//@Html.EditorForModel()它把名字當做標題,根據值來生成對應的編輯項
檢查模型是那種類型,有哪些屬性,根據這些屬性生成對應的編輯項
屬性的名字作爲前面的albel,後面的值的類型作爲編輯項的參考
    </fieldset>


缺點:沒有在訂單類中的促銷碼需要額外處理
<fieldset>
        <legend>Payment</legend>標題
        <p>We're running a promotion: all music is free with the promo code: "FREE"</p>


        <div class="editor-label">
            @Html.Label("Promo Code")
        </div>
        <div class="editor-field">
            @Html.TextBox("PromoCode")
        </div>
    </fieldset>
   
<input type="submit" value="Submit Order" />
}


<div>
    @Html.ActionLink("Back to List", "Index")
</div>




添加視圖 edit  order..models
在model上沒有那個屬性時 自己另寫處理
@using(html.beginform())


完善order類  採用標註的方式 讓用戶正確輸入
在標註中 正則表達式[regularExpression(@"[A-Za-z]",errormessage="錯誤提示")]
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}",
            ErrorMessage = "Email is is not valid.")]


         代替顯示的頭標題  [displaynane("代替名")]
         不用用戶輸入的字段 [scaffoldColumn(false)]
          顯示的方式 [datatype(datatype.emailladdress)]


至此,效果:
選擇結賬沒有登錄就會轉到index讓它去登錄或者臨時註冊
發現模型修改 數據庫會自動重除重建
需要在一次加入aspnet....exe讓數據庫中添加成員表和用戶表


註冊失敗是因爲數據庫中沒有那些表 需要用.exe將表重新創建出來


store 專輯 家務購物車 chexkout  註冊
發現錯誤 因爲配置中沒有問題和答案 所以修改webconfig文件
鏈接字符
是否予以口令找回
是否予以口令重設
要不要求提供問題和答案
要不要求email是唯一的
口令被哈希掉之後保存
口令可以試幾次
最短口令長度
口令至少有幾個非字母符號
修改答案和密碼後註冊成功


添加complete視圖
強類型 模型類輸入int 
你的訂單號碼爲@model即可


更新錯誤視圖 讓用戶可以後退
-------------------------------------小視圖--------------------------
cartsummary購物車的彙總信息
獲取購物車
調去函數 獲取購物車中貨物數量 傳遞到視圖中
partialview(“字符串”)使用部分視圖
字符串視圖
不選強類型 創建分佈視圖 不適用模板頁
分佈視圖裏面什麼也沒有
在裏面添加超鏈接即可
購物車(5)
顯示的信息,action,controller,傳遞的參數


在佈局頁添加首頁 商店  
<li @{html.renderAction("cartsummary","shoppingcart")}</li>




在storecontroller.cs增加genremenu方法
[childactiononly] //子視圖
public actionresult genremenu()
{
  var genres=storedb.genres.tolist();
  return partialview(genres);
}






強類型  模型類爲genre ..models  支架模版爲list 創建爲分佈視圖
刪掉重寫
@model Ienumerable<musicstore.models.genre>
<ul id="">
@foreach(var genre in model)
{
 <li>@html.actionlink(genre.name,"browse","store",new {Genre=genre.name},null)</li>
}


在layout頁面添加
@{html.renderaction("GenreMenu","store");}
@RenderBody();
<div id="footer">...






登陸註銷狀態'
[childactiononly] //子視圖
public actionresult loginstatus()
{
 獲取用戶對象
  system.security.principal.Iprincipal user =this.httpContext.uset;
  return this.patialview();
}


添加子視圖
強類型  system.security.principal.Iprincipal 創建分佈視圖
@if(@Model.Identity.IsAuthenticated)
{
 <span>@model.identity.name</span>
  @Html.ActionLink("註銷",LogOff","Account");
}
else
{
 @Html.ActionLink(""登陸",LogOn","Account");
}
在模板頁添加一句 <li>@{Html.RenderAction("LLoginStatus","Account");}</li>


更新store的browse.cshtml頁面,以便加上圖片
<ul id="album-list">
foreach
<a href="@url.action("details",new {id=albumid})"
   <img alt="@album.title" src=@model。albuurl">
   <span>@model.title</span>
</a>




更新主頁來顯示暢銷專輯
修改了album.cs 添加末尾一句


更新site.css
添加.genre{width:1000px;}


--------獲取銷售前五名
homecontroller.cs
[NonAction]
        //得到銷售前幾名  非action方法  不允許用戶在地址欄直接調用
        public List<Album> GetTopSellingAlbums(int count)
        {
            return storeDB.Albums
                .OrderByDescending(a => a.OrderDetails.Count())//按照count()倒敘
                .Take(count)//去前幾個
                .ToList();
        }


跟新 index方法 調用top函數




轉到home/index視圖
@model List<音樂商店.Models.Album>
@{
    ViewBag.Title = "Index";
}


<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>




完善問題:
界面不美觀
專輯的圖片操作 上傳圖片 修改的時候能夠重新選擇圖片的上傳等
專輯沒有分頁
沒加上清空購物車
添加購物車的時候要確認可以添加數量
沒有直接對人員進行管理 包括對管理員角色的分配
當用戶已經登陸,權限不夠的時候提示管理員登陸


已經解決的問題:
用戶角色不高級時頁面亂排  且沒跳轉
新添加的再末尾
詳情沒有圖片
只要不註銷一直在線 
用戶原來沒註冊,註冊之後不能 要購物顯示不了購物車那的內容
登陸之後 即使沒有購買物品也可以提交訂單 
填寫訂單時沒有準確的驗證用戶輸入的格式
進不到管理後臺那一個頁面
登陸之後的用戶名和註銷沒在同一行


 






 









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章