日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

BrnShop开源网上商城第二讲:ASP.NET MVC框架

發布時間:2023/12/2 asp.net 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BrnShop开源网上商城第二讲:ASP.NET MVC框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
BrnShop開源網上商城第二講:ASP.NET MVC框架 原文:BrnShop開源網上商城第二講:ASP.NET MVC框架

  在團隊設計BrnShop的web項目之初,我們碰到了兩個問題,第一個是數據的復用和傳遞,第二個是大mvc框架和小mvc框架的選擇。下面我依次來說明下。

? ? ? 首先是數據的復用和傳遞:對于BrnShop的每一次請求,程序都要分成好幾個階段執行,例如驗證,執行動作方法等等,在各個階段我們可能需要重復使用同一信息,而我們的愿景就是希望此信息只需獲取一次,然后沿著流程管道一直流動,這樣在后面的階段中就可以直接使用,不用再重新獲取了,提高程序的性能。舉例來說:在授權驗證階段,我們為對用戶進行驗證,從而獲取了用戶信息,當驗證結束后,此用戶信息并不被拋棄,而是保留下來,這樣在后面的動作方法中我們就不需要再次獲取用戶信息,而是直接使用剛才在授權中保留下來的用戶信息就可以了。

  具體實現是這樣的:首先我們給這些需要公用的數據定義個上下文類,它們分別是BrnShop.Web.Framework項目中的WebWorkContext類和AdminWorkContext類,其中WebWorkContext是前臺項目使用的上下文,AdminWorkContext是后臺項目使用的上下文。代碼很簡單,就是定義了一些公共字段,具體如下:

using System; using System.Collections.Generic;using BrnShop.Core;namespace BrnShop.Web.Framework {/// <summary>/// 商城前臺工作上下文類/// </summary>public class WebWorkContext{public ShopConfigInfo ShopConfig = BSPConfig.ShopConfig;//商城配置信息public bool IsHttpAjax;//當前請求是否為ajax請求public string IP;//用戶ippublic RegionInfo Region;//區域信息public string Url;//當前urlpublic string UrlReferrer;//上一次訪問的urlpublic string Sid;//用戶sidpublic int Uid = -1;//用戶idpublic string UserName;//用戶名public string UserEmail;//用戶郵箱public string UserMobile;//用戶手機號public string NickName;//用戶昵稱public string Avatar;//用戶頭像public string Password;//用戶密碼public string PayCreditName;//支付積分名稱public int PayCreditCount = 0;//支付積分數量public string RankCreditName;//等級積分名稱public int RankCreditCount = 0;//等級積分數量public PartUserInfo PartUserInfo;//用戶信息public int UserRid = -1;//用戶等級idpublic UserRankInfo UserRank;//用戶等級信息public string UserRTitle;//用戶等級標題public int AdminGid = -1;//用戶管理員組idpublic AdminGroupInfo AdminGroup;//用戶管理員組信息public string AdminGTitle;//管理員組標題public string Controller;//控制器public string Action;//動作方法public string PageKey;//頁面標示符public string ThemeName;//當前主題名稱public string ImageDir;//圖片目錄public string CSSDir;//css目錄public string ScriptDir;//腳本目錄public int OnlineUserCount = 0;//在線總人數public int OnlineMemberCount = 0;//在線會員數public int OnlineGuestCount = 0;//在線游客數public string SearchWord;//搜索詞public int SCProductCount = 0;//購物車中商品數量public List<CategoryInfo> CategoryList;//分類列表public List<NavInfo> NavList;//導航列表public FriendLinkInfo[] FriendLinkList;//友情鏈接列表public List<HelpInfo> HelpList;//幫助列表public DateTime StartExecuteTime;//頁面開始執行時間public double ExecuteTime;//頁面執行時間public int ExecuteCount = 0;//執行的sql語句數目public string ExecuteDetail;//執行的sql語句細節public string ShopVersion = BSPVersion.SHOP_VERSION;//商城版本public string ShopCopyright = BSPVersion.SHOP_COPYRIGHT;//商城版權 } } View Code using System;using BrnShop.Core;namespace BrnShop.Web.Framework {/// <summary>/// 商城后臺工作上下文類/// </summary>public class AdminWorkContext{public ShopConfigInfo ShopConfig = BSPConfig.ShopConfig;//商城配置信息public bool IsHttpAjax;//當前請求是否為ajax請求public string IP;//用戶ippublic RegionInfo Region;//區域信息public string Url;//當前urlpublic string UrlReferrer;//上一次訪問的urlpublic string Sid;//用戶sidpublic int Uid = -1;//用戶idpublic string UserName;//用戶名public string UserEmail;//用戶郵箱public string UserMobile;//用戶手機號public string NickName;//用戶昵稱public string Avatar;//用戶頭像public string Password;//用戶密碼public PartUserInfo PartUserInfo;//用戶信息public int UserRid = -1;//用戶等級idpublic UserRankInfo UserRank;//用戶等級信息public string UserRTitle;//用戶等級標題public int AdminGid = -1;//用戶管理員組idpublic AdminGroupInfo AdminGroup;//用戶管理員組信息public string AdminGTitle;//管理員組標題public string Controller;//控制器public string Action;//動作方法public string PageKey;//頁面標示符 } } View Code

?  有了上下文類后,我們需要找一個可以保證上下文流動的地方。在翻看了asp.net mvc的源碼后,我們找到一個好地方,這個地方就在控制器的基類Controller中。在Controller中微軟定義了六個方法,具體如下:

  • protected override void Initialize(RequestContext requestContext);說明:初始化調用構造函數后可能不可用的數據。
  • protected virtual void OnAuthorization(AuthorizationContext filterContext);說明:在進行授權時調用。
  • protected virtual void OnActionExecuted(ActionExecutedContext filterContext);說明:在調用操作方法后調用。
  • protected virtual void OnActionExecuting(ActionExecutingContext filterContext);說明:在調用操作方法前調用。
  • protected virtual void OnResultExecuted(ResultExecutedContext filterContext);說明:在執行由操作方法返回的操作結果后調用。
  • protected virtual void OnResultExecuting(ResultExecutingContext filterContext);說明:在執行由操作方法返回的操作結果前調用。

  這些都是虛方法,所以我們可以定義一個繼承自Controller的新控制器,然后重寫這些方法。由于這些方法是在同一個類中,所以它們可以共享同一個字段(這個字段就是上下文),而且其他的控制器都是繼承自這個新控制器類,所以在動作方法中也是可以訪問這個共享字段(父類的字段)。新控制器類分別是BrnShop.Web.Framework項目中BaseWebController類和BaseAdminController類,其中BaseWebController為前臺控制器類,BaseAdminController為后臺控制器類,具體實現如下:

using System; using System.Text; using System.Web.Mvc; using System.Web.Routing; using System.Collections.Generic;using BrnShop.Core; using BrnShop.Services;namespace BrnShop.Web.Framework {/// <summary>/// 商城前臺基礎控制器類/// </summary>public class BaseWebController : Controller{//工作上下午public WebWorkContext WorkContext = new WebWorkContext();protected override void Initialize(RequestContext requestContext){base.Initialize(requestContext);WorkContext.IsHttpAjax = WebHelper.IsAjax();WorkContext.IP = WebHelper.GetIP();WorkContext.Region = Regions.GetRegionByIP(WorkContext.IP);WorkContext.Url = WebHelper.GetUrl();WorkContext.UrlReferrer = WebHelper.GetUrlReferrer();//獲得用戶唯一標示符sidWorkContext.Sid = ShopUtils.GetSidCookie();if (WorkContext.Sid.Length == 0){//生成sidWorkContext.Sid = Sessions.GenerateSid();//將sid保存到cookie中 ShopUtils.SetSidCookie(WorkContext.Sid);}PartUserInfo partUserInfo;//獲得用戶idint uid = ShopUtils.GetUidCookie();if (uid < 1)//當用戶為游客時 {//創建游客partUserInfo = Users.CreatePartGuest();}else//當用戶為會員時 {//獲得保存在cookie中的密碼string password = ShopUtils.GetPasswordCookie();//防止用戶密碼被篡改為危險字符if (password.Length == 0 || !SecureHelper.IsBase64String(password)){//創建游客partUserInfo = Users.CreatePartGuest();ShopUtils.SetUidCookie(-1);ShopUtils.SetPasswordCookie("");}else{partUserInfo = Users.GetPartUserByUidAndPwd(uid, password);if (partUserInfo != null){//發放登陸積分Credits.SendLoginCredits(ref partUserInfo, DateTime.Now);}else//當會員的賬號或密碼不正確時,將用戶置為游客 {partUserInfo = Users.CreatePartGuest();ShopUtils.SetUidCookie(-1);ShopUtils.SetPasswordCookie("");}}}//設置用戶等級if (UserRanks.IsBanUserRank(partUserInfo.UserRid) && partUserInfo.LiftBanTime <= DateTime.Now){UserRankInfo userRankInfo = UserRanks.GetUserRankByCredits(partUserInfo.PayCredits);Users.UpdateUserRankByUid(partUserInfo.Uid, userRankInfo.UserRid);partUserInfo.UserRid = userRankInfo.UserRid;}WorkContext.PartUserInfo = partUserInfo;WorkContext.Uid = partUserInfo.Uid;WorkContext.UserName = partUserInfo.UserName;WorkContext.UserEmail = partUserInfo.Email;WorkContext.UserMobile = partUserInfo.Mobile;WorkContext.Password = partUserInfo.Password;WorkContext.NickName = partUserInfo.NickName;WorkContext.Avatar = partUserInfo.Avatar;WorkContext.PayCreditName = Credits.PayCreditName;WorkContext.PayCreditCount = partUserInfo.PayCredits;WorkContext.RankCreditName = Credits.RankCreditName;WorkContext.RankCreditCount = partUserInfo.RankCredits;WorkContext.UserRid = partUserInfo.UserRid;WorkContext.UserRank = UserRanks.GetUserRankById(partUserInfo.UserRid);WorkContext.UserRTitle = WorkContext.UserRank.Title;//設置用戶管理員組WorkContext.AdminGid = partUserInfo.AdminGid;WorkContext.AdminGroup = AdminGroups.GetAdminGroupById(partUserInfo.AdminGid);WorkContext.AdminGTitle = WorkContext.AdminGroup.Title;//設置當前控制器類名WorkContext.Controller = RouteData.Values["controller"].ToString().ToLower();//設置當前動作方法名WorkContext.Action = RouteData.Values["action"].ToString().ToLower();WorkContext.PageKey = string.Format("/{0}/{1}", WorkContext.Controller, WorkContext.Action);//當前商城主題名稱WorkContext.ThemeName = WorkContext.ShopConfig.ThemeName;//設置圖片目錄WorkContext.ImageDir = string.Format("{0}/Themes/{1}/Images", WorkContext.ShopConfig.ImageCDN, WorkContext.ThemeName);//設置css目錄WorkContext.CSSDir = string.Format("{0}/Themes/{1}/CSS", WorkContext.ShopConfig.CSSCDN, WorkContext.ThemeName);//設置腳本目錄WorkContext.ScriptDir = string.Format("{0}/Scripts", WorkContext.ShopConfig.ScriptCDN);//在線總人數WorkContext.OnlineUserCount = OnlineUsers.GetOnlineUserCount();//在線游客數WorkContext.OnlineGuestCount = OnlineUsers.GetOnlineGuestCount();//在線會員數WorkContext.OnlineMemberCount = WorkContext.OnlineUserCount - WorkContext.OnlineGuestCount;//搜索詞WorkContext.SearchWord = string.Empty;//購物車中商品數量WorkContext.SCProductCount = Orders.GetShopCartProductCountCookie();//分類列表WorkContext.CategoryList = Categories.GetCategoryList();//設置導航列表WorkContext.NavList = Navs.GetNavList();//設置友情鏈接列表WorkContext.FriendLinkList = FriendLinks.GetFriendLinkList();//設置幫助列表WorkContext.HelpList = Helps.GetHelpList();}protected override void OnAuthorization(AuthorizationContext filterContext){//不能應用在子方法上if (filterContext.IsChildAction)return;//商城已經關閉if (WorkContext.ShopConfig.IsClosed == 1 && WorkContext.AdminGid == 1 && WorkContext.PageKey != "/account/login" && WorkContext.PageKey != "/account/logout"){filterContext.Result = PromptView(WorkContext.ShopConfig.CloseReason);return;}//當前時間為禁止訪問時間if (ValidateHelper.BetweenPeriod(WorkContext.ShopConfig.BanAccessTime) && WorkContext.AdminGid == 1 && WorkContext.PageKey != "/account/login" && WorkContext.PageKey != "/account/logout"){filterContext.Result = PromptView("當前時間不能訪問本商城");return;}//當用戶ip在被禁止的ip列表時if (ValidateHelper.InIPList(WorkContext.IP, WorkContext.ShopConfig.BanAccessIP)){filterContext.Result = PromptView("您的IP被禁止訪問本商城");return;}//當用戶ip不在允許的ip列表時if (!string.IsNullOrEmpty(WorkContext.ShopConfig.AllowAccessIP) && !ValidateHelper.InIPList(WorkContext.IP, WorkContext.ShopConfig.AllowAccessIP)){filterContext.Result = PromptView("您的IP被禁止訪問本商城");return;}//當用戶IP被禁止時if (BannedIPs.CheckIP(WorkContext.IP)){filterContext.Result = PromptView("您的IP被禁止訪問本商城");return;}//當用戶等級是禁止訪問等級時if (WorkContext.UserRid == 1){filterContext.Result = PromptView("您的賬號當前被鎖定,不能訪問");return;}//判斷目前訪問人數是否達到允許的最大人數if (WorkContext.OnlineUserCount > WorkContext.ShopConfig.MaxOnlineCount && WorkContext.AdminGid == 1 && (WorkContext.Controller != "account" && (WorkContext.Action != "login" || WorkContext.Action != "logout"))){filterContext.Result = PromptView("商城人數達到訪問上限, 請稍等一會再訪問!");return;}}protected override void OnActionExecuting(ActionExecutingContext filterContext){//不能應用在子方法上if (filterContext.IsChildAction)return; #if DEBUG//清空執行的sql語句數目RDBSHelper.ExecuteCount = 0;//清空執行的sql語句細節RDBSHelper.ExecuteDetail = ""; #endif//頁面開始執行時間WorkContext.StartExecuteTime = DateTime.Now;//當用戶為會員時,更新用戶的在線時間if (WorkContext.Uid > 0)Users.UpdateUserOnlineTime(WorkContext.Uid);//更新在線用戶 Asyn.UpdateOnlineUser(WorkContext.Uid, WorkContext.Sid, WorkContext.IP, WorkContext.Region.RegionId);//更新PV統計if (WorkContext.ShopConfig.UpdatePVStatTimespan != 0)Asyn.UpdatePVStat(WorkContext.Uid, WorkContext.Region.RegionId, WebHelper.GetBrowserType(), WebHelper.GetOSType());}protected override void OnActionExecuted(ActionExecutedContext filterContext){//不能應用在子方法上if (filterContext.IsChildAction)return; #if DEBUG//執行的sql語句數目WorkContext.ExecuteCount = RDBSHelper.ExecuteCount;//執行的sql語句細節if (RDBSHelper.ExecuteDetail == string.Empty)WorkContext.ExecuteDetail = "當前頁面沒有和數據庫的任何交互";elseWorkContext.ExecuteDetail = "<div>數據查詢分析:</div>" + RDBSHelper.ExecuteDetail; #endif//頁面執行時間WorkContext.ExecuteTime = DateTime.Now.Subtract(WorkContext.StartExecuteTime).TotalMilliseconds / 1000;}protected override void OnException(ExceptionContext filterContext){ShopUtils.WriteLogFile(filterContext.Exception);if (WorkContext.IsHttpAjax)filterContext.Result = new ContentResult { Content = "error" };elsefilterContext.Result = new ViewResult() { ViewName = "Error" };}/// <summary>/// 獲得路由中的值/// </summary>/// <param name="key"></param>/// <param name="defaultValue">默認值</param>/// <returns></returns>protected string GetRouteString(string key, string defaultValue){object value = RouteData.Values[key];if (value != null)return value.ToString();elsereturn defaultValue;}/// <summary>/// 獲得路由中的值/// </summary>/// <param name="key"></param>/// <returns></returns>protected string GetRouteString(string key){return GetRouteString(key, "");}/// <summary>/// 獲得路由中的值/// </summary>/// <param name="key"></param>/// <param name="defaultValue">默認值</param>/// <returns></returns>protected int GetRouteInt(string key, int defaultValue){return TypeHelper.ObjectToInt(RouteData.Values[key], defaultValue);}/// <summary>/// 獲得路由中的值/// </summary>/// <param name="key"></param>/// <returns></returns>protected int GetRouteInt(string key){return GetRouteInt(key, 0);}/// <summary>/// 提示信息視圖/// </summary>/// <param name="message">提示信息</param>/// <returns></returns>protected ViewResult PromptView(string message){return View("Prompt", new PromptModel(message));}/// <summary>/// 提示信息視圖/// </summary>/// <param name="backUrl">返回地址</param>/// <param name="message">提示信息</param>/// <returns></returns>protected ViewResult PromptView(string backUrl, string message){return View("Prompt", new PromptModel(backUrl, message));}/// <summary>/// 獲得驗證錯誤列表/// </summary>/// <returns></returns>protected string GetVerifyErrorList(){if (ModelState.Count == 0)return "null";StringBuilder errorList = new StringBuilder("[");foreach (KeyValuePair<string, ModelState> item in ModelState){errorList.AppendFormat("{0}'key':'{1}','msg':'{2}'{3},", "{", item.Key, item.Value.Errors[0].ErrorMessage, "}");}errorList.Remove(errorList.Length - 1, 1);errorList.Append("]");return errorList.ToString();}} } View Code using System; using System.Web; using System.Web.Mvc; using System.Web.Routing;using BrnShop.Core; using BrnShop.Services;namespace BrnShop.Web.Framework {/// <summary>/// 商城后臺基礎控制器類/// </summary>public class BaseAdminController : Controller{//工作上下午public AdminWorkContext WorkContext = new AdminWorkContext();protected override void Initialize(RequestContext requestContext){base.Initialize(requestContext);WorkContext.IsHttpAjax = WebHelper.IsAjax();WorkContext.IP = WebHelper.GetIP();WorkContext.Region = Regions.GetRegionByIP(WorkContext.IP);WorkContext.Url = WebHelper.GetUrl();WorkContext.UrlReferrer = WebHelper.GetUrlReferrer();//獲得用戶唯一標示符sidWorkContext.Sid = ShopUtils.GetSidCookie();if (WorkContext.Sid.Length == 0){//生成sidWorkContext.Sid = Sessions.GenerateSid();//將sid保存到cookie中 ShopUtils.SetSidCookie(WorkContext.Sid);}PartUserInfo partUserInfo;//獲得用戶idint uid = ShopUtils.GetUidCookie();if (uid < 1)//當用戶為游客時 {//創建游客partUserInfo = Users.CreatePartGuest();}else//當用戶為會員時 {//獲得保存在cookie中的密碼string password = ShopUtils.GetPasswordCookie();//防止用戶密碼被篡改為危險字符if (password.Length == 0 || !SecureHelper.IsBase64String(password)){//創建游客partUserInfo = Users.CreatePartGuest();ShopUtils.SetUidCookie(-1);ShopUtils.SetPasswordCookie("");}else{partUserInfo = Users.GetPartUserByUidAndPwd(uid, password);if (partUserInfo != null){//發放登陸積分Credits.SendLoginCredits(ref partUserInfo, DateTime.Now);}else//當會員的賬號或密碼不正確時,將用戶置為游客 {partUserInfo = Users.CreatePartGuest();ShopUtils.SetUidCookie(-1);ShopUtils.SetPasswordCookie("");}}}//設置用戶等級if (UserRanks.IsBanUserRank(partUserInfo.UserRid) && partUserInfo.LiftBanTime <= DateTime.Now){UserRankInfo userRankInfo = UserRanks.GetUserRankByCredits(partUserInfo.PayCredits);Users.UpdateUserRankByUid(partUserInfo.Uid, userRankInfo.UserRid);partUserInfo.UserRid = userRankInfo.UserRid;}WorkContext.PartUserInfo = partUserInfo;WorkContext.Uid = partUserInfo.Uid;WorkContext.UserName = partUserInfo.UserName;WorkContext.UserEmail = partUserInfo.Email;WorkContext.UserMobile = partUserInfo.Mobile;WorkContext.Password = partUserInfo.Password;WorkContext.NickName = partUserInfo.NickName;WorkContext.Avatar = partUserInfo.Avatar;WorkContext.UserRid = partUserInfo.UserRid;WorkContext.UserRank = UserRanks.GetUserRankById(partUserInfo.UserRid);WorkContext.UserRTitle = WorkContext.UserRank.Title;//設置用戶管理員組WorkContext.AdminGid = partUserInfo.AdminGid;WorkContext.AdminGroup = AdminGroups.GetAdminGroupById(partUserInfo.AdminGid);WorkContext.AdminGTitle = WorkContext.AdminGroup.Title;//設置當前控制器類名WorkContext.Controller = RouteData.Values["controller"].ToString().ToLower();//設置當前動作方法名WorkContext.Action = RouteData.Values["action"].ToString().ToLower();WorkContext.PageKey = string.Format("/{0}/{1}", WorkContext.Controller, WorkContext.Action);}protected override void OnAuthorization(AuthorizationContext filterContext){//不能應用在子方法上if (filterContext.IsChildAction)return;//當用戶ip不在允許的后臺訪問ip列表時if (!string.IsNullOrEmpty(WorkContext.ShopConfig.AdminAllowAccessIP) && !ValidateHelper.InIPList(WorkContext.IP, WorkContext.ShopConfig.AdminAllowAccessIP)){if (WorkContext.IsHttpAjax)filterContext.Result = new ContentResult { Content = "404" };elsefilterContext.Result = new RedirectResult("/");return;}//當用戶IP被禁止時if (BannedIPs.CheckIP(WorkContext.IP)){if (WorkContext.IsHttpAjax)filterContext.Result = new ContentResult { Content = "404" };elsefilterContext.Result = new RedirectResult("/");return;}//當用戶等級是禁止訪問等級時if (WorkContext.UserRid == 1){if (WorkContext.IsHttpAjax)filterContext.Result = new ContentResult { Content = "404" };elsefilterContext.Result = new RedirectResult("/");return;}//如果當前用戶沒有登錄if (WorkContext.Uid < 1){if (WorkContext.IsHttpAjax)filterContext.Result = new ContentResult { Content = "404" };elsefilterContext.Result = new RedirectResult("/");return;}//如果當前用戶不是管理員if (WorkContext.AdminGid == 1){if (WorkContext.IsHttpAjax)filterContext.Result = new ContentResult { Content = "404" };elsefilterContext.Result = new RedirectResult("/");return;}//判斷當前用戶是否有訪問當前頁面的權限if (WorkContext.Controller != "home" && !AdminGroups.CheckAuthority(WorkContext.AdminGid, WorkContext.Controller, WorkContext.PageKey)){if (WorkContext.IsHttpAjax)filterContext.Result = new ContentResult { Content = "notpermit" };elsefilterContext.Result = PromptView("你沒有當前操作的權限!");return;}}protected override void OnActionExecuting(ActionExecutingContext filterContext){//不能應用在子方法上if (filterContext.IsChildAction)return;//當用戶為會員時,更新用戶的在線時間if (WorkContext.Uid > 0)Users.UpdateUserOnlineTime(WorkContext.Uid);//更新在線用戶 Asyn.UpdateOnlineUser(WorkContext.Uid, WorkContext.Sid, WorkContext.IP, WorkContext.Region.RegionId);//更新PV統計if (WorkContext.ShopConfig.UpdatePVStatTimespan != 0)Asyn.UpdatePVStat(WorkContext.Uid, WorkContext.Region.RegionId, WebHelper.GetBrowserType(), WebHelper.GetOSType());}protected override void OnException(ExceptionContext filterContext){ShopUtils.WriteLogFile(filterContext.Exception);if (WorkContext.IsHttpAjax)filterContext.Result = new ContentResult { Content = "error" };elsefilterContext.Result = new ViewResult() { ViewName = "Error" };}/// <summary>/// 提示信息視圖/// </summary>/// <param name="message">提示信息</param>/// <returns></returns>protected ViewResult PromptView(string message){return View("Prompt", new PromptModel(ShopUtils.GetAdminRefererCookie(), message));}/// <summary>/// 提示信息視圖/// </summary>/// <param name="backUrl">返回地址</param>/// <param name="message">提示信息</param>/// <returns></returns>protected ViewResult PromptView(string backUrl, string message){return View("Prompt", new PromptModel(backUrl, message));}/// <summary>/// 提示信息視圖/// </summary>/// <param name="backUrl">返回地址</param>/// <param name="message">提示信息</param>/// <param name="isAutoBack">是否自動返回</param>/// <returns></returns>protected ViewResult PromptView(string backUrl, string message, bool isAutoBack){return View("Prompt", new PromptModel(backUrl, message) { IsAutoBack = isAutoBack });}/// <summary>/// 添加后臺操作日志/// </summary>/// <param name="operation">操作行為</param>protected void AddAdminOperateLog(string operation){AddAdminOperateLog(operation, "");}/// <summary>/// 添加后臺操作日志/// </summary>/// <param name="operation">操作行為</param>/// <param name="description">操作描述</param>protected void AddAdminOperateLog(string operation, string description){AdminOperateLogs.CreateAdminOperateLog(WorkContext.Uid, WorkContext.UserName, WorkContext.AdminGid, WorkContext.AdminGTitle, WorkContext.IP, operation, description);}} } View Code

  到此事情還沒完,那就是這個上下文是控制器的字段,在視圖中如果想訪問它需要強制類型轉換下,代碼為:((BaseWebController)(this.ViewContext.Controller)).WorkContext;試想一下我們每次訪問上下文都需要這么長的一段代碼那是怎樣的煎熬呀?不過幸好有解決辦法,那就是重寫mvc的WebViewPage頁(如果你不知道WebViewPage和mvc的編譯過程請閱讀大神“Artech”的相關文章,地址如下:http://www.cnblogs.com/artech/)。具體代碼在BrnShop.Web.Framework項目中WebViewPage類和AdminViewPage類,其中WebViewPage為前臺視圖類,AdminViewPage為后臺視圖類:

using System; using System.Text; using System.Web.Mvc; using System.Collections.Generic;namespace BrnShop.Web.Framework {/// <summary>/// 前臺視圖頁面基類型/// </summary>public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>{public WebWorkContext WorkContext;public override void InitHelpers(){base.InitHelpers();WorkContext = ((BaseWebController)(this.ViewContext.Controller)).WorkContext;}/// <summary>/// 獲得驗證錯誤列表/// </summary>/// <returns></returns>public MvcHtmlString GetVerifyErrorList(){ModelStateDictionary modelState = ((Controller)(this.ViewContext.Controller)).ModelState;if (modelState == null || modelState.Count == 0)return new MvcHtmlString("null");StringBuilder errorList = new StringBuilder("[");foreach (KeyValuePair<string, ModelState> item in modelState){errorList.AppendFormat("{0}'key':'{1}','msg':'{2}'{3},", "{", item.Key, item.Value.Errors[0].ErrorMessage, "}");}errorList.Remove(errorList.Length - 1, 1);errorList.Append("]");return new MvcHtmlString(errorList.ToString());}}/// <summary>/// 前臺視圖頁面基類型/// </summary>public abstract class WebViewPage : WebViewPage<dynamic>{} } View Code using System;namespace BrnShop.Web.Framework {/// <summary>/// 后臺視圖頁面基類型/// </summary>public abstract class AdminViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>{public AdminWorkContext WorkContext;public override void InitHelpers(){base.InitHelpers();Html.EnableClientValidation(true);//啟用客戶端驗證Html.EnableUnobtrusiveJavaScript(true);//啟用非侵入式腳本WorkContext = ((BaseAdminController)(this.ViewContext.Controller)).WorkContext;}}/// <summary>/// 后臺視圖頁面基類型/// </summary>public abstract class AdminViewPage : AdminViewPage<dynamic>{} } View Code

?  定義好新的視圖類后,我們需要通知編譯器使用這個新類,通知方式在視圖文件的web.config中,具體見下圖:

  通過將"pageBaseType"的值設置為我們的新類名,我們就可以在視圖文件中直接使用上下文了。例:@WorkContext.ShopConfig.SEOKeyword

  說完了數據的復用和傳遞,我們再來說說大mvc框架和小mvc框架的問題。首先何為大mvc框架,何為小mvc框架?

  • 大mvc框架指的是盡量完整的一套asp.net mvc框架,包含路由,控制器,模型綁定,模型校驗,篩選器等等。
  • 小mvc框架指的是只包含項目所必須使用的mvc部分,對于使用不到的部分盡量不用或移除。

  大家可能覺得這有什么難的?但是對于一個開源項目來說這確實是一個很重要的問題,因為開源項目的產品面向的是全國甚至是全世界的開發者,大家的技術參差不齊,有的高,有個低。為了保證盡可能多的覆蓋開發者,只有原汁原味的mvc才對開發者更親切和熟悉,所以應該使用大mvc框架??墒且豢顑炐愕漠a品不只是面向初級開發者,還需要面對高級開發者,對于高級開發者來說他們希望獲得項目最大的可控權,所以框架應該盡量只使用最核心的mvc部分,這樣留給開發者的空間才能更大,這樣這樣看來又應該使用小mvc框架。下面我從兩個方面來說明我們是如何解決這個問題的。

  首先是mvc篩選器:看過我們源碼的園友已經發現,我們項目中沒有定義任何一個篩選器類。那我們的篩選器在哪兒?答案就在上面的上下文流動中,在上面重寫的篩選器方法中我們實現所有篩選。如果你想針對某個控制器A單獨篩選你可以在A中再一次重寫篩選器方法添加自己的代碼。如果你想只針對某一方法進行篩選你只需要單獨在方法中篩選就可以了。這樣通過使用內置在controller中的篩選方法我們實現了和第三方篩選器的隔離,也減少了反射獲取篩選器的次數。

  其次是模型綁定和校驗:我們首先通過手動獲取request集合的方式去除所有模型綁定,以登陸代碼為例:

/// <summary>/// 登錄/// </summary>public ActionResult Login()//注意此方面沒有任何參數 {string returnUrl = WebHelper.GetQueryString("returnUrl");if (returnUrl.Length == 0)returnUrl = "/";if (WorkContext.ShopConfig.LoginType == "")return PromptView(returnUrl, "商城目前已經關閉登陸功能!");if (WorkContext.Uid > 0)return PromptView(returnUrl, "您已經登錄,無須重復登錄!");if (WorkContext.ShopConfig.LoginFailTimes != 0 && LoginFailLogs.GetLoginFailTimesByIp(WorkContext.IP) >= WorkContext.ShopConfig.LoginFailTimes)return PromptView(returnUrl, "您已經輸入錯誤" + WorkContext.ShopConfig.LoginFailTimes + "次密碼,請15分鐘后再登陸!");//get請求if (WebHelper.IsGet()){ViewData.Add("oAuthPluginList", Plugins.GetOAuthPluginList());return View(new LoginModel());}//post請求LoginModel model = new LoginModel();//模型綁定 手動綁定model.AccountName = WebHelper.GetFormString(WorkContext.ShopConfig.ShadowName).Trim();model.Password = WebHelper.GetFormString("password");model.IsRemember = WebHelper.GetFormInt("isRemember");model.VerifyCode = WebHelper.GetFormString("verifyCode");//模型驗證PartUserInfo partUserInfo = VerifyLogin(model);if (!ModelState.IsValid)//驗證失敗時 {ViewData.Add("oAuthPluginList", Plugins.GetOAuthPluginList());return View(model);}else//驗證成功時 {//當用戶等級是禁止訪問等級時if (partUserInfo.UserRid == 1)return PromptView("您的賬號當前被鎖定,不能訪問");//刪除登陸失敗日志 LoginFailLogs.DeleteLoginFailLogByIP(WorkContext.IP);//更新用戶最后訪問int regionId = WorkContext.Region != null ? WorkContext.Region.RegionId : -1;Users.UpdateUserLastVisit(partUserInfo.Uid, WorkContext.IP, regionId, DateTime.Now);//更新購物車中用戶id Orders.UpdateShopCartUidBySid(partUserInfo.Uid, WorkContext.Sid);//將用戶信息寫入cookie中ShopUtils.SetUserCookie(partUserInfo, (WorkContext.ShopConfig.IsRemember == 1 && model.IsRemember == 1) ? 30 : -1);return Redirect(returnUrl);}}

其次是模型校驗,校驗又分為兩部分。第一部分是驗證,對此我們也是采用手動校驗的方式,同樣以登陸為例:

/// <summary>/// 登錄驗證/// </summary>private PartUserInfo VerifyLogin(LoginModel model){PartUserInfo partUserInfo = null;//驗證賬戶名if (string.IsNullOrWhiteSpace(model.AccountName)){ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, "賬戶名不能為空");}else if (model.AccountName.Length < 4 || model.AccountName.Length > 50){ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, "賬戶名必須大于3且不大于50個字符");}else if ((!SecureHelper.IsSafeSqlString(model.AccountName))){ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, "賬戶名不存在");}//驗證密碼if (string.IsNullOrWhiteSpace(model.Password)){ModelState.AddModelError("password", "密碼不能為空");}else if (model.Password.Length < 4 || model.Password.Length > 32){ModelState.AddModelError("password", "密碼必須大于3且不大于32個字符");}//驗證驗證碼if (CommonHelper.IsInArray(WorkContext.PageKey, WorkContext.ShopConfig.VerifyPages)){if (string.IsNullOrWhiteSpace(model.VerifyCode)){ModelState.AddModelError("verifyCode", "驗證碼不能為空");}else if (model.VerifyCode.ToLower() != Sessions.GetValueString(WorkContext.Sid, "verifyCode")){ModelState.AddModelError("verifyCode", "驗證碼不正確");}}//當以上驗證全部通過時if (ModelState.IsValid){if (BSPConfig.ShopConfig.LoginType.Contains("2") && ValidateHelper.IsEmail(model.AccountName))//郵箱登陸 {partUserInfo = Users.GetPartUserByEmail(model.AccountName);if (partUserInfo == null)ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, "郵箱不存在");}else if (BSPConfig.ShopConfig.LoginType.Contains("3") && ValidateHelper.IsMobile(model.AccountName))//手機登陸 {partUserInfo = Users.GetPartUserByMobile(model.AccountName);if (partUserInfo == null)ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, "手機不存在");}else if (BSPConfig.ShopConfig.LoginType.Contains("1"))//用戶名登陸 {partUserInfo = Users.GetPartUserByName(model.AccountName);if (partUserInfo == null)ModelState.AddModelError(WorkContext.ShopConfig.ShadowName, "用戶名不存在");}//判斷密碼是否正確if (partUserInfo != null && Users.CreateUserPassword(model.Password, partUserInfo.Salt) != partUserInfo.Password){LoginFailLogs.AddLoginFailTimes(WorkContext.IP, DateTime.Now);//增加登陸失敗次數ModelState.AddModelError("password", "密碼不正確");}}return partUserInfo;}

通過上面代碼大家可以看出所有的驗證都是手動進行的。

  校驗的第二部分是驗證信息顯示,在mvc中大家經常使用Html.ValidationMessageFor之類的方法來顯示驗證信息,所以為了保證上述方法還能夠正常使用,我們需要將所有驗證信息都添加到ModelState中(因為Html.ValidationMessageFor之類的方法實現本質就是通過獲取ModelState指定鍵值的內容來判斷是否顯示和顯示什么內容)。到此我們已經有了校驗數據,剩下的就是在視圖中顯示了。關于顯示我們仍然可以使用Html.ValidationMessageFor之類的方法;如果你想獲得更大的靈活性你可以使用視圖頁面的“GetVerifyErrorList”方法,此方法在我們新定義的視圖基類中,它的功能就是將校驗信息構建成一個json對象。代碼如下:

/// <summary>/// 獲得驗證錯誤列表/// </summary>/// <returns></returns>public MvcHtmlString GetVerifyErrorList(){ModelStateDictionary modelState = ((Controller)(this.ViewContext.Controller)).ModelState;if (modelState == null || modelState.Count == 0)return new MvcHtmlString("null");StringBuilder errorList = new StringBuilder("[");foreach (KeyValuePair<string, ModelState> item in modelState){errorList.AppendFormat("{0}'key':'{1}','msg':'{2}'{3},", "{", item.Key, item.Value.Errors[0].ErrorMessage, "}");}errorList.Remove(errorList.Length - 1, 1);errorList.Append("]");return new MvcHtmlString(errorList.ToString());}

下面給出一個使用例子,代碼是登陸視圖的代碼:

//腳本代碼 <script type="text/javascript">var verifyErrorList= @GetVerifyErrorList();$(function(){if (verifyErrorList != null) {for(var i = 0; i < verifyErrorList.length; i++){$("#"+verifyErrorList[i].key+"Error").html(verifyErrorList[i].msg)}}})</script>//html代碼<tr><td>密碼:</td><td><input type="password" name="password" id="password" value="@Model.Password"/></td><td><span style="color: Red;" id="passwordError"></span></td></tr>

  通過以上實現我們既保證框架能夠兼容mvc各個功能,又為高級開發者提供了足夠的擴展空間。PS:團隊中有位同事曾經將asp.net mvc源碼中有關模型綁定和模型校驗的代碼全部刪除,并完美運行實例,性能和開銷都少了不少,有興趣的朋友可以去試試!

  如果想下載商城源碼可以點此下載。有對網上商城程序設計感興趣的朋友,歡迎加入QQ群:235274151,大家可以交流下!

posted on 2014-06-26 17:51 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/3810565.html

總結

以上是生活随笔為你收集整理的BrnShop开源网上商城第二讲:ASP.NET MVC框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日韩精品久久久免费观看夜色 | 免费观看国产精品 | 日韩理论电影在线 | 日韩在线观看 | 国产亚洲精品久久久久久 | 日韩精品字幕 | 日韩免费视频线观看 | 超碰免费公开 | 中文字幕欲求不满 | 中文日韩在线视频 | 欧美一区二区三区在线看 | 色婷婷国产在线 | 国产视频不卡一区 | 在线观看色网 | 成人亚洲网| 日韩精品五月天 | 午夜视频免费播放 | 国产精品乱码一区二三区 | 国产亚洲无 | 伊人一级| 在线观看国产高清视频 | 狠狠狠色丁香婷婷综合激情 | 国产流白浆高潮在线观看 | 综合激情网... | 亚洲视频 视频在线 | 免费高清在线一区 | 91av视频导航 | 五月婷婷操| 99精品国产在热久久下载 | 超碰官网 | 在线看中文字幕 | 久久精品8 | 在线激情网 | 日韩一级黄色片 | 美女视频久久久 | 国产成人精品久久二区二区 | 在线 视频 一区二区 | 4438全国亚洲精品在线观看视频 | 天天射天天爱天天干 | 贫乳av女优大全 | 久久久久女人精品毛片 | 日韩欧美在线不卡 | mm1313亚洲精品国产 | 欧美日韩国产一区二区三区在线观看 | 91成年人网站 | 亚洲黄色av网址 | 久久久精品网站 | 国产在线观看免费av | 亚洲精品久久久久中文字幕二区 | 国产成人精品999在线观看 | 国产91在线观 | 成人avav| 久草精品电影 | 欧美久久久 | 欧美小视频在线 | 国产v在线 | 成人黄色电影在线观看 | 精品国偷自产在线 | 国产3p视频 | 亚洲成人网av | 粉嫩av一区二区三区四区在线观看 | 最新中文字幕在线播放 | 国产一级大片免费看 | a视频在线观看 | 成人黄色片免费 | 日韩av在线网站 | 国产精品com| 亚洲,国产成人av | 婷婷丁香花五月天 | 国产一区欧美日韩 | 国产午夜一区 | 天天色天天综合网 | 一区二区三区免费 | 99久久er热在这里只有精品15 | 成人免费xxxxxx视频 | 91手机电影 | 欧美国产日韩激情 | 免费av电影网站 | 精品福利网站 | 亚洲一区二区高潮无套美女 | 99久久精品久久久久久动态片 | 丁香花在线观看视频在线 | 国产在线精品国自产拍影院 | www.人人草| 国产亚洲精品成人av久久ww | 精品国产福利在线 | 四虎在线影视 | 免费在线观看视频一区 | 国产一区免费观看 | 伊人天天狠天天添日日拍 | 操少妇视频 | 91在线视频免费观看 | 欧美aaa级片 | 夜夜躁天天躁很躁波 | 欧美日韩视频在线观看免费 | 国产91综合一区在线观看 | 狠狠狠色丁香综合久久天下网 | 国产精品久久久久久妇 | 国产91对白在线 | 国产在线黄色 | 黄色性av| 日韩免费视频 | 日日激情 | 色婷婷激情五月 | 麻豆系列在线观看 | 五月天久久久久 | 亚洲高清av | 久久免费视频2 | 粉嫩av一区二区三区四区五区 | 精品美女久久久久久免费 | 在线视频观看亚洲 | 国产一区视频免费在线观看 | 日韩高清成人 | 久久综合九色综合97_ 久久久 | 99热精品国产一区二区在线观看 | a级成人毛片 | avwww在线 | 西西www4444大胆视频 | 亚洲小视频在线观看 | 丁香婷婷色综合亚洲电影 | 97电影在线 | 国产亚洲高清视频 | 97色婷婷成人综合在线观看 | 亚洲国产精品小视频 | 日韩精品视频免费专区在线播放 | 青青河边草免费视频 | 日韩在线观看视频一区二区三区 | 久久精品屋| 色吊丝在线永久观看最新版本 | 国产黄色观看 | 成人黄色在线视频 | 国产精品第十页 | 国产美女无遮挡永久免费 | 天天干,天天射,天天操,天天摸 | а天堂中文最新一区二区三区 | 精品亚洲一区二区 | 精品一区二三区 | 亚洲视频aaa | 亚洲激情精品 | 久久久久久久精 | 天天插综合 | 亚洲午夜久久久久久久久 | 国产精品网站一区二区三区 | 亚洲一二区精品 | 丁香六月色 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 一区二区伦理电影 | 日本三级不卡视频 | 99久久99热这里只有精品 | 久精品视频在线观看 | 日本高清免费中文字幕 | 国产在线 一区二区三区 | www.狠狠色.com | 久久精品国产第一区二区三区 | 黄色a大片 | 正在播放国产一区二区 | 亚洲精品午夜久久久久久久久久久 | 免费能看的黄色片 | 日韩在线视频线视频免费网站 | a级国产乱理论片在线观看 特级毛片在线观看 | 欧美日韩在线观看一区二区 | 亚洲精品99久久久久久 | 日韩欧美在线一区 | 超碰在线公开 | 免费看日韩片 | 午夜av影院 | 国产精品美女久久久久久久久 | 久久五月天婷婷 | 香蕉影院在线 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 国产一级高清视频 | 日韩av一区二区三区在线观看 | 免费三级a | 国产剧情在线一区 | 园产精品久久久久久久7电影 | 国产成人精品一区二区三区 | 黄色软件视频网站 | 国产一级h| 国产黄色大片 | 久久久久女人精品毛片九一 | 精品久久久久久亚洲综合网 | 午夜久久久久久久久 | 91桃色视频 | 欧美亚洲一区二区在线 | 国产黄色精品在线 | 免费av网址在线观看 | 日韩精品一区电影 | 成人免费在线观看av | 精品少妇一区二区三区在线 | 国产精品一区在线观看你懂的 | 夜夜夜草 | 国产精品第52页 | 国产一区二区三区高清播放 | 最近免费中文视频 | 国产糖心vlog在线观看 | 久久97精品 | 国产一区二区在线免费 | 亚洲欧美国产视频 | www.色爱 | 婷婷久久丁香 | 香蕉精品视频在线观看 | 在线你懂的视频 | 69人人| 久久精品99精品国产香蕉 | 国产午夜视频在线观看 | 国产美女在线观看 | 91福利视频久久久久 | 99久久日韩精品免费热麻豆美女 | 91精品1区2区| 97国产情侣爱久久免费观看 | 国产视频精选 | 黄色福利 | 91av片| 天天综合导航 | 亚洲精品视频在线观看免费视频 | 午夜国产在线 | 久久久久久电影 | 色全色在线资源网 | 国产不卡av在线 | 欧美一级免费高清 | 成年人在线播放视频 | 亚洲成年人av| 亚洲美女免费精品视频在线观看 | 国产精品a级 | 国产片网站| 又黄又爽又色无遮挡免费 | 国产区av在线 | 欧美男男激情videos | 国产99久久精品一区二区永久免费 | 国产高清福利在线 | 国产亚洲一区二区在线观看 | 黄色一级大片在线免费看国产一 | 中国黄色一级大片 | 久久黄色小说 | 日本精品在线 | 久久国产精品小视频 | 久久视频国产 | 成人h电影 | 久久九九免费视频 | 91污在线观看 | 色www精品视频在线观看 | 日韩精品一区二区免费 | 中文字幕一区二区在线播放 | 天天草天天干天天射 | 国产精品精品视频 | www操操操 | 色噜噜在线观看 | 亚洲日本一区二区在线 | 色国产精品一区在线观看 | 香蕉久久久久久av成人 | 国产一级在线观看视频 | 色婷婷综合激情 | 97在线精品国自产拍中文 | 欧美成人999 | 91免费版在线 | 久久久精品久久 | 尤物一区二区三区 | 三上悠亚一区二区在线观看 | 成人在线免费视频观看 | 色黄www小说 | 黄污网 | 国产日韩精品一区二区三区在线 | 日韩黄色软件 | 国产一卡二卡四卡国 | 国产精品一区二区精品视频免费看 | 亚洲美女免费精品视频在线观看 | 国产免费专区 | 成年人免费看的视频 | 国产九九九九九 | 色网站在线免费观看 | 亚州av免费 | 婷婷色在线 | 狠狠干在线播放 | 极品国产91在线网站 | 天天干天天干天天干 | 天天操天天干天天插 | 国产精品18久久久久久首页狼 | 国产综合小视频 | 国产精品第 | 日产av在线播放 | 亚洲永久av | 欧美性极品xxxx娇小 | 天天躁日日躁狠狠躁av麻豆 | 日韩一级网站 | 国产成人久 | 狠狠伊人 | 国产探花在线看 | 午夜色站 | 国产一区免费观看 | 看片黄网站 | 岛国av在线不卡 | 国产91精品一区二区麻豆亚洲 | 精品久久久久久亚洲 | 亚洲一区二区精品在线 | 91自拍视频在线 | 日韩在线一二三区 | 一级久久精品 | 91麻豆精品 | 久草在线免费看视频 | 精品一区二区三区四区在线 | 欧美与欧洲交xxxx免费观看 | 成人毛片在线观看视频 | 国产99自拍 | 久久99精品国产麻豆宅宅 | 久久精品久久精品久久39 | 久久艹在线观看 | 国产在线第三页 | 成人国产精品一区二区 | 精品福利片| 四虎海外影库www4hu | 麻豆一区二区 | 片网址| 能在线观看的日韩av | 九九视频在线观看视频6 | 亚洲成av人影院 | 综合久久久久久久久 | 久久男女视频 | 日韩精品你懂的 | 久草精品视频在线观看 | 国产精品99久久久久人中文网介绍 | av在线专区| 久久精品久久精品久久 | 久久精品国产久精国产 | 成人午夜网址 | 久热色超碰 | 国产一区二区三精品久久久无广告 | 亚洲播放一区 | 91大神一区二区三区 | 伊人www22综合色 | 天天操人人干 | 91av蜜桃 | 欧美激情xxxx性bbbb | 欧美日韩一二三四区 | 日本在线观看中文字幕无线观看 | 精品国产成人 | 日日日网 | 六月丁香婷婷网 | 久久久国产精品电影 | 在线www色 | 亚洲欧美日韩一二三区 | www99精品| 香蕉视频91 | 婷婷在线综合 | 国产精品毛片网 | 黄色大全免费网站 | 超碰日韩 | 久久午夜电影网 | 97成人资源站 | 在线国产一区二区三区 | 欧美动漫一区二区三区 | 国产福利在线免费 | 欧美 国产 视频 | 91在线porny国产在线看 | 午夜精品在线看 | 欧美日本不卡高清 | 亚洲 欧美变态 另类 综合 | 久久9999久久免费精品国产 | 国产高清免费在线观看 | 一区在线电影 | 88av视频| 综合色伊人 | 久草爱视频 | 国产又粗又猛又黄又爽 | 国产黄色片免费观看 | 狠狠狠狠狠狠 | 99久久久久国产精品免费 | 在线综合 亚洲 欧美在线视频 | 伊人干综合 | 黄色国产区 | 中文字幕一区2区3区 | 免费在线黄 | 在线观看免费成人 | 黄污在线观看 | 国产最顶级的黄色片在线免费观看 | 人人看黄色 | 最新高清无码专区 | 香蕉视频啪啪 | 视频一区亚洲 | 久久夜色精品国产欧美乱极品 | 福利网址在线观看 | 狠狠操91| 91精品国产91久久久久 | 久草在线观看资源 | 超碰人人草人人 | 欧美日韩在线播放一区 | 成人网在线免费视频 | 日韩,精品电影 | 精品视频www| 玖草在线观看 | 国产色综合 | 中文字幕av最新 | 免费91麻豆精品国产自产在线观看 | 国产精品综合久久 | 麻豆网站免费观看 | 一级免费观看 | 999成人国产 | 欧美精品一区二区蜜臀亚洲 | 欧美在一区 | 欧美性黄网官网 | av片中文字幕 | 一本色道久久综合亚洲二区三区 | 日日躁天天躁 | 亚洲,播放 | 婷婷激情五月综合 | 在线观看免费视频你懂的 | 丁香激情网 | 麻豆免费视频观看 | 色狠狠综合天天综合综合 | 亚洲精欧美一区二区精品 | 成人av片在线观看 | 麻豆成人在线观看 | 99久久99精品 | 91桃色免费观看 | 国产99久久久国产精品 | 欧美另类激情 | 国产视频色 | 日韩草比| 91精品在线播放 | 韩国av免费观看 | 成人av资源站 | 久久久国产精品人人片99精片欧美一 | 婷婷日 | 国产精品嫩草影视久久久 | 国产一级片免费观看 | 国产在线一区观看 | 日韩在线看片 | 欧美视频国产视频 | 天天噜天天色 | 日韩久久片 | 欧美国产日韩在线观看 | 午夜在线观看影院 | 日日日视频 | 久久人人爽人人爽人人片av免费 | 草草草影院 | 99精品国产高清在线观看 | 狠狠色丁香九九婷婷综合五月 | 日韩精品在线免费播放 | 国产专区在线播放 | 97电影网手机版 | 成 人 a v天堂 | 精品一区电影 | 亚洲传媒在线 | 天堂中文在线视频 | 五月婷婷中文 | 西西444www | 91av官网| 99视频在线精品免费观看2 | 国产精品原创视频 | 欧美粗又大 | 西西444www大胆高清视频 | 日日日日干 | 精品1区2区3区 | 一级片免费在线 | 婷婷在线视频 | 日韩国产精品毛片 | 久久9视频 | 天天爽人人爽 | 亚洲电影毛片 | 贫乳av女优大全 | 精品视频免费在线 | 国产高清av免费在线观看 | 岛国av在线不卡 | 99久久精品免费看国产四区 | 99久久www| 亚洲日本在线一区 | 成人app在线免费观看 | 六月色婷| 精品一区二区三区香蕉蜜桃 | 久久99久久99精品免观看粉嫩 | 国产一区二区三区四区大秀 | av在线播放一区二区三区 | 中文av网 | 美女久久精品 | 五月综合婷 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 久碰视频在线观看 | 欧美地下肉体性派对 | 日韩啪啪小视频 | 欧美综合干 | av在线播放一区二区三区 | 亚洲 欧美 另类人妖 | 99国产情侣在线播放 | 亚洲国产中文字幕在线 | 色综合久久中文字幕综合网 | 欧美一二区视频 | 欧美日韩国产一区二区三区 | 超薄丝袜一二三区 | 国产亚洲精品久久久久久久久久久久 | 狠狠色狠狠色终合网 | 国产成人精品av在线 | 色视频在线免费观看 | 亚洲成av人片在线观看www | 日韩在线电影观看 | 五月精品 | 国产一级免费观看视频 | 视频在线观看一区 | 免费黄在线看 | 在线观看免费一级片 | 91九色pron| 日韩视频www | 色多多视频在线观看 | 首页中文字幕 | 日韩久久在线 | 热久久视久久精品18亚洲精品 | 亚洲国产剧情 | 91欧美视频网站 | 2019中文字幕第一页 | 九九热免费观看 | 丁香六月综合网 | 一区二区三区精品在线视频 | 日韩欧美一区二区在线 | 亚洲欧美成人 | 天天爱天天射天天干天天 | 亚洲天堂精品视频在线观看 | 国产69精品久久久久99尤 | 韩日成人av | 亚洲成人精品在线观看 | 精品久久久久久一区二区里番 | 国产一级免费观看视频 | 久久综合一本 | 国产精品18久久久久久久网站 | 激情影音 | 91精品视频免费在线观看 | 激情av一区二区 | www天天干 | 午夜美女视频 | 国产精品久久久久永久免费 | 日韩一区二区三 | 超碰个人在线 | 中国一级片免费看 | 亚洲婷婷伊人 | 中文字幕在线观看视频一区二区三区 | 91精品毛片| 人人干人人艹 | 91精品视频导航 | 日韩免费三级 | 久久99国产精品久久 | 欧美日韩视频一区二区三区 | 国产午夜一区 | 国产91免费观看 | 免费91在线观看 | 日本三级久久 | 中文av影院 | 国产精品6999成人免费视频 | 日韩久久影院 | 色网站在线观看 | 国产成人精品亚洲日本在线观看 | 91久久国产露脸精品国产闺蜜 | 一区电影 | 97精品国产97久久久久久 | 欧美精品v国产精品 | 99久久激情视频 | 婷香五月 | 欧美一区二区在线 | 亚洲精品动漫成人3d无尽在线 | 国产精品入口麻豆www | 麻豆国产网站入口 | 视频在线观看国产 | 在线观看va | 日韩中文字幕一区 | 精品免费久久久久久 | 国产精品久久久久av | 国产精品中文字幕在线播放 | 婷婷网在线| av日韩不卡| 国产精品成久久久久三级 | 天天亚洲综合 | 91爱在线| 中文伊人 | 日日干综合 | 中文字幕成人 | av黄色国产 | 婷婷激情久久 | 婷婷在线五月 | 97理论片 | 成人av一区二区兰花在线播放 | 欧美性生活小视频 | 香蕉网站在线观看 | 国产精品99久久99久久久二8 | 国产首页 | 亚洲精品一区二区精华 | 男女激情网址 | 91亚洲精| 日韩精品中文字幕在线 | 亚洲久草在线视频 | 日韩av不卡在线观看 | av网站地址 | 成人av网站在线播放 | 国产+日韩欧美 | 国产在线精 | 丁香色综合 | aaa日本高清在线播放免费观看 | 国产 中文 日韩 欧美 | 五月开心婷婷网 | 国产视频日韩 | 激情综合六月 | 国产成人精品一区二区三区网站观看 | 国产精品久久精品 | 亚洲色图激情文学 | 五月婷在线播放 | 激情五月婷婷综合网 | 波多野结衣在线视频一区 | 丁香花在线观看免费完整版视频 | 日韩午夜在线观看 | av观看网站 | 狠狠狠色丁香婷婷综合久久五月 | 在线免费高清一区二区三区 | 特级毛片网 | 午夜久久久久 | 天天操天天色天天 | 91看片淫黄大片一级在线观看 | 美女久久网站 | 婷婷综合影院 | 在线97 | 香蕉影视在线观看 | adn—256中文在线观看 | 91黄色影视 | 日韩av中文字幕在线免费观看 | 久久99精品久久久久久三级 | 香蕉一区| 亚洲男女精品 | 在线欧美最极品的av | 黄色午夜网站 | 免费a v在线 | 91麻豆精品国产91久久久无限制版 | 91精品国自产在线观看欧美 | 最近中文字幕在线 | 免费福利在线视频 | 国产午夜亚洲精品 | 国产成人精品久久久久 | 久久国产午夜精品理论片最新版本 | 少妇搡bbbb搡bbb搡aa | 婷婷激情久久 | 探花视频免费观看 | 亚洲视频免费在线 | 不卡国产视频 | 五月丁色 | 99精品国产99久久久久久97 | 亚洲欧美日韩中文在线 | 日韩视频www | 五月天天天操 | 成人一级电影在线观看 | www.久久久精品 | 91在线视频在线观看 | www天天干 | 久久久久久久久毛片精品 | 久久久久久久久久久综合 | 久久九九精品 | 美女网站在线免费观看 | 亚洲视频资源在线 | 国产精品二区三区 | 久操中文字幕在线观看 | 最新超碰在线 | 日韩欧美一级二级 | 97影视| 麻豆一区在线观看 | 午夜久久影视 | 欧美色黄| 伊人春色电影网 | 最新国产精品久久精品 | 狠狠色伊人亚洲综合网站野外 | 深爱激情开心 | 国产精品久久久久久久久久久久久久 | 中国一级片在线观看 | 在线看国产一区 | 天天爽夜夜爽精品视频婷婷 | 欧美天天干 | 国产精品不卡在线 | 中文字幕在线观看第一页 | 久久电影色 | 日韩一区精品 | 日韩视频在线观看免费 | 九九爱免费视频 | 99精品视频在线 | 99视频精品免费观看, | 97在线观看视频 | 亚洲狠狠婷婷综合久久久 | 在线有码中文字幕 | 免费一级片视频 | 日本视频网 | 波多野结衣在线观看视频 | 日韩欧美在线第一页 | 草久在线观看视频 | 又粗又长又大又爽又黄少妇毛片 | 久久亚洲免费 | japanesexxxhd奶水 91在线精品一区二区 | 国产精品美女久久久久久 | 99国产一区二区三精品乱码 | 亚洲传媒在线 | 国产福利91精品一区二区三区 | 国产精品丝袜久久久久久久不卡 | 玖玖玖影院 | 日本九九视频 | 国产在线精品二区 | 亚洲国产精品人久久电影 | 久久免费中文视频 | 激情久久一区二区三区 | 亚洲精品mv在线观看 | 中文字幕在线专区 | 国产成人免费观看久久久 | 免费a网站| 在线观看色视频 | 国产婷婷一区二区 | 中文字幕欧美三区 | 久久深爱网 | 99操视频| 亚洲欧洲国产精品 | 国产又粗又猛又黄又爽 | 中文字幕2021 | 国产精品女视频 | 亚洲日本在线一区 | 亚洲一级黄色大片 | 国产一级在线看 | 人人看人人做人人澡 | 国产99爱 | 欧美性生活小视频 | 久久国产品 | 最近日本韩国中文字幕 | 日韩在线精品一区 | 免费在线黄 | 精品久久网 | 九热在线 | 伊人天堂av | 97精品国产97久久久久久粉红 | 久久精品牌麻豆国产大山 | 国产精品美女久久 | 黄色一级大片在线免费看产 | www.久久免费视频 | 精品天堂av | 亚洲成人资源网 | 日韩精品无码一区二区三区 | 91精品国产一区二区在线观看 | 香蕉97视频观看在线观看 | 久久www免费人成看片高清 | 天天操狠狠操网站 | 欧美日韩中文在线观看 | 久久久久欠精品国产毛片国产毛生 | 亚洲一级特黄 | 日韩久久精品一区二区 | 911国产在线观看 | 亚洲一二区精品 | 久久综合色8888 | 日韩电影黄色 | 911亚洲精品第一 | 精品一区在线 | 丁香国产视频 | 香蕉视频国产在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 大胆欧美gogo免费视频一二区 | 丁香婷婷久久久综合精品国产 | 亚洲成人午夜在线 | 国产一级不卡毛片 | 最近最新最好看中文视频 | 免费国产在线精品 | 亚洲精品乱码久久久久久蜜桃动漫 | 国产不卡免费 | 91av免费看 | 久久综合精品国产一区二区三区 | 久久久久久久国产精品 | 日韩系列在线 | 福利视频入口 | 国产精品久久在线 | 成人在线小视频 | 国产精品女人久久久久久 | 国产精品99视频 | 国产午夜精品一区二区三区嫩草 | 中文字幕中文字幕在线中文字幕三区 | 久久久精品二区 | 亚洲一区二区黄色 | 亚洲理论片在线观看 | 超碰在线网 | 日日草天天干 | 激情综合色播五月 | 国产成人在线精品 | 91.dizhi永久地址最新 | 久久久久久国产精品 | 婷婷综合网 | 国产夫妻av在线 | 天堂在线免费视频 | 国产亚州精品视频 | 98涩涩国产露脸精品国产网 | 国产特级毛片aaaaaaa高清 | 97精品久久| 99免在线观看免费视频高清 | 久久色亚洲 | av一区二区三区在线观看 | 一级片视频在线 | 91桃色免费视频 | 国产va精品免费观看 | 在线观看亚洲精品 | 91av在线免费看 | 日韩精品视频久久 | 九九在线播放 | 久久久久国产一区二区 | 成人在线观看免费 | 一区二区三区四区在线 | 国产在线精品国自产拍影院 | 天天操天天爱天天干 | 午夜性色| 五月花丁香婷婷 | 黄视频网站大全 | 国产福利在线 | 国产一区二区中文字幕 | 亚洲深爱激情 | 久久这里只有精品视频99 | 天天天干天天天操 | 成人 国产 在线 | 免费a v在线 | 粉嫩av一区二区三区免费 | 美女网站一区 | .国产精品成人自产拍在线观看6 | 久久99精品久久久久久三级 | 丁香花中文字幕 | 日韩免费在线观看视频 | 亚洲在线看 | 国产尤物一区二区三区 | 亚洲成人av片 | 99精品国产一区二区三区不卡 | 五月综合色婷婷 | 国产精品99久久久久久宅男 | 欧美精品久久久久性色 | 久草免费在线视频观看 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 久久精品男人的天堂 | 久久婷婷精品 | 成人啪啪18免费游戏链接 | 成人久久免费 | 久久婷婷综合激情 | www日韩欧美 | 国产私拍在线 | 91精品国产91 | 六月丁香在线观看 | 天天操夜夜操夜夜操 | 五月婷综合 | 新版资源中文在线观看 | 久久99精品久久久久久秒播蜜臀 | 中文av一区二区 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 99久久精品国产欧美主题曲 | 又黄又爽又无遮挡免费的网站 | 在线观看国产中文字幕 | 最新av免费在线观看 | 免费成人在线网站 | 久草国产精品 | 亚洲 欧洲 国产 精品 | 中文字幕在线观看播放 | 一本一本久久a久久 | 婷婷中文字幕 | 久久天天操 | 久久久久国产精品免费网站 | 四虎影视成人永久免费观看视频 | 玖玖综合网 | 在线免费看黄色 | 欧美国产三区 | 久久久久婷| 欧美日韩视频一区二区三区 | 午夜影院在线观看18 | 伊人视频| 青春草视频 | 黄网站免费看 | 97综合网| 美国av大片 | 日韩在线观看a | 日本h视频在线观看 | 亚洲午夜在线视频 | 在线午夜电影神马影院 | 亚洲成人资源在线观看 | 欧美 日韩 国产 成人 在线 | 久香蕉| 国产精品网站一区二区三区 | 99免费精品视频 | 国产亚洲午夜高清国产拍精品 | 亚洲高清久久久 | 日韩在线观看视频免费 | 在线观看免费国产小视频 | 日韩精品中文字幕久久臀 | 在线中文字幕观看 | 中文字幕在线国产 | 黄视频色网站 | 国内外成人在线 | 在线电影日韩 | 激情久久影院 | 久一在线 | 毛片激情永久免费 | av超碰在线观看 | av成人在线播放 | 国产日韩欧美视频在线观看 | 日日干日日色 | 国产精品视频 | 香蕉免费在线 | 美女免费黄网站 | 99视频免费在线观看 | 91网页版免费观看 | 亚洲精品视频www | 91在线看免费 | 久久黄色免费观看 | v片在线看 | 香蕉精品在线观看 | 91精品久久久久久综合五月天 | 国产成年人av | 国产精品久久久久久久久久久杏吧 | 天堂素人在线 | 二区中文字幕 | 久久久久电影网站 | 偷拍精偷拍精品欧洲亚洲网站 | 一区二区三区久久 | 国产专区日韩专区 | 日韩二三区| 欧美日韩免费网站 | 国产黄色一级片在线 | 午夜av片| 亚洲毛片在线观看. | 网站在线观看你们懂的 | 久久9精品| 久草久热| 欧美国产日韩中文 | 久久久午夜精品理论片中文字幕 | 在线成人短视频 | 精品一区二区免费在线观看 | 久久成熟 | 亚洲综合在线视频 | 日韩大片在线免费观看 | 日本久久中文字幕 | 亚洲欧美在线视频免费 | 色就是色综合 | 久久在线播放 | 欧美小视频在线观看 | 久久人人爽人人 | 国产中文字幕一区二区 | 天天插天天爽 | 欧美国产一区二区 | 日日噜噜噜噜夜夜爽亚洲精品 | 最近日本中文字幕 | 国产精品96久久久久久吹潮 | 亚洲国产精品视频在线观看 | 狠狠狠的干 | 六月色丁 | 久久国产精品成人免费浪潮 | 96视频免费在线观看 | 中文字幕激情 | 亚洲国产精品久久久久婷婷884 | 中文字幕美女免费在线 | 国产精品一区二区在线播放 | 久久综合色综合88 | 亚洲欧美少妇 | 午夜婷婷在线播放 | 中文字幕日本电影 | 一本一本久久a久久精品牛牛影视 | 在线观看亚洲a | 亚洲精品久久久久58 | 美女视频免费一区二区 | 婷婷久久网 | 人人干人人添 | 亚洲女同videos | 9999在线视频 | 九九九免费视频 | 日本中文在线播放 | 93久久精品日日躁夜夜躁欧美 | 免费观看全黄做爰大片国产 | 免费看的黄色片 | 337p日本欧洲亚洲大胆裸体艺术 | 九九久久久久久久久激情 | av中文字幕网址 | 操操操操网 | 美女黄网久久 | 国产无遮挡又黄又爽在线观看 | 亚洲一区二区三区精品在线观看 | 久久亚洲专区 | 成人av影视观看 | 久久综合福利 | 久久综合婷婷国产二区高清 | 天堂久久电影网 | av怡红院| 久久性生活片 | 亚洲黄色在线观看 | 91av99| 久久观看免费视频 | 国产精品刺激对白麻豆99 | 色福利网 | 四虎影视8848dvd | 91精品国产自产在线观看永久 | 婷婷久久精品 | 久久短视频 | 手机av资源| 五月婷婷一级片 | 久久精品久久精品久久精品 | 友田真希x88av | 五月天色网站 | 国产黄在线看 | 成人在线免费视频观看 | 国产剧情在线一区 | 97免费在线观看 | 91大神精品视频在线观看 | 狠狠色噜噜狠狠狠合久 | av资源在线看 | 国产在线a视频 | 射久久久 | 三级黄色片在线观看 |