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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

ASP.NET MVC中商品模块小样

發布時間:2023/12/16 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC中商品模块小样 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在前面的幾篇文章中,已經在控制臺和界面實現了屬性值的笛卡爾乘積,這是商品模塊中的一個難點。本篇就來實現在ASP.NET MVC4下商品模塊的一個小樣。與本篇相關的文章包括:


1、ASP.NET MVC中實現屬性和屬性值的組合,即笛卡爾乘積01, 在控制臺實現?
2、ASP.NET MVC中實現屬性和屬性值的組合,即笛卡爾乘積02, 在界面實現??
3、再議ASP.NET MVC中CheckBoxList的驗證??
4、ASP.NET MVC在服務端把異步上傳的圖片裁剪成不同尺寸分別保存,并設置上傳目錄的尺寸限制??
5、ASP.NET MVC異步驗證是如何工作的01,jQuery的驗證方式、錯誤信息提示、validate方法的背后??
6、ASP.NET MVC異步驗證是如何工作的02,異步驗證表單元素的創建??
7、ASP.NET MVC異步驗證是如何工作的03,jquery.validate.unobtrusive.js是如何工作的?
8、MVC批量更新,可驗證并解決集合元素不連續控制器接收不完全的問題?
9、MVC擴展生成CheckBoxList并水平排列??

?

本篇主要包括:

□ 商品模塊小樣簡介
□ 領域模型和視圖模型
□ 控制器和視圖實現

?

商品模塊小樣簡介

?

※ 界面

○ 類別區域,用來顯示產品類別,點擊選擇某個類別,在"產品屬性"區域出現該類別下的所有屬性,以及屬性值,對于單選的屬性值用Select顯示,對于多選的屬性值用CheckBoxList顯示。
○ 產品描述,表示數據庫中產品表中的字段,當然實際情況中,這里的字段更多,比如上傳時間,是否通過,產品賣點,等等。
○ 產品屬性,只有點擊選擇產品類別,這里才會顯示
○ 定價按鈕,點擊這個按鈕,如果"產品屬性"區域中有CheckBoxList項,"產品SKU與定價"區域會出現關于屬性值、產品價格的SKU組合項;如果"產品屬性"區域中沒有CheckBoxList項,"產品SKU與定價"區域只出現一個有關價格的input元素。另外,每次點擊定價按鈕,出現提交按鈕,定價按鈕隱藏。
○ 產品SKU與定價:這里要么呈現屬性值、價格的SKU項,要么只出現一個有關價格的input元素

?

※ 點擊類別項,在"產品屬性"區域包括CheckBoxList

○ 點擊類名中的"家電"選項,在"產品屬性"區域中出現屬性及其值,有些屬性值以Select呈現,有些屬性值以CheckBoxList呈現
○ 點擊屬性行后面的"刪除行"直接刪除屬性行

?

※ 點擊類別項,在"產品屬性"區域包括CheckBoxList,點擊"定價"按鈕

點擊"定價"按鈕,如果每組的CheckBoxList中沒有一項被選中,會在屬性行后面出現錯誤提示。在"產品SKU與定價"區域不會出現內容。

?

※ 點擊類別項,在"產品屬性"區域包括CheckBoxList,點擊"定價"按鈕,再點擊CheckBoxList選項,某些錯誤提示消失

點擊CheckBoxList中的某項,該屬性行后面的錯誤提示消失。在"產品SKU與定價"區域還是不會出現內容。

?

※ 點擊類別項,在"產品屬性"區域包括CheckBoxList,如果所有的CheckBoxList至少有一項被選中,點擊"定價"按鈕

?

○ 會把所有的選中屬性值進行笛卡爾乘積顯示到"產品SKU與定價"區域
○ 出現"提交"按鈕
○ 如果有關價格的input驗證不通過會出現異步驗證錯誤信息
○ 與有關價格的input一起渲染的還有一個隱藏域,用來存放該SKU項的屬性值Id,以便和價格一起被保存到數據庫

?

?

※ 點擊類別項,在"產品屬性"區域不包括CheckBoxList

當選擇類別中的"家具"項,在"產品屬性"區域中的屬性值只是以Select來呈現。

?

※ 點擊類別項,在"產品屬性"區域不包括CheckBoxList,點擊"定價"按鈕

如果"產品屬性"區域中只有Select元素,點擊"定價"按鈕,在"產品SKU與定價"區域只出現有關價格的input,并且帶異步驗證,同時還出現提交按鈕。

?

※ 在控制器提交產品的方法中打斷點,點擊"提交"按鈕

在界面提交的包括:

?

在控制器方法中收到了所有的提交:

?

?

領域模型和視圖模型

?

有關產品類別的領域模型:

public class Category { public int Id { get; set; } public string Name { get; set; } }

?

有關屬性的領域模型:

public class Prop { public int Id { get; set; } public string Name { get; set; } public int CategoryId { get; set; } public short InputType { get; set; } public Category Category { get; set; } }

?

以上,InputType屬性對應InputTypeEnum的枚舉項,會依據此屬性加載不同的視圖(Select或CheckBoxList)。

?

public enum InputTypeEnum { //下拉選框 PropDropDownList = 0, //復選框 PropCheckBoxList = 1 }

?

有關屬性值的領域模型:

public class PropOption { public int Id { get; set; } public string RealValue { get; set; } public int PropId { get; set; } public Prop Prop { get; set; } }

?

在產品提交頁,和產品有關包括:產品類別、產品本身的描述、屬性及屬性值(屬性值有些以Select顯示,有些以CheckBoxList顯示)、屬性值和價格的SKU組合項。提煉出有關產品的一個視圖模型:

public class ProductVm { public ProductVm() { this.PropOptionDs = new List<PropOptionVmD>(); this.ProductSKUs = new List<ProductSKUVm>(); this.PropOptionCs = new List<PropOptionVmC>(); } public int Id { get; set; } [Required(ErrorMessage = "必填")] public int CategoryId { get; set; } [Required(ErrorMessage = "必填")] [Display(Name = "產品編號")] [MaxLength(10, ErrorMessage = "最大長度10")] public string Code { get; set; } [Required(ErrorMessage = "必填")] [Display(Name = "產品名稱")] [MaxLength(10, ErrorMessage = "最大長度10")] public string Name { get; set; } public List<PropOptionVmD> PropOptionDs { get; set; } public List<PropOptionVmC> PropOptionCs { get; set; } public List<ProductSKUVm> ProductSKUs { get; set; } }

以上,
○ PropOptionDs表示以Select顯示屬性值的、有關屬性和屬性值的集合
○ PropOptionCs表示以CheckBoxList顯示屬性值的、有關屬性和屬性值的集合
○ ProductSKUs 表示SKU項的集合

?

PropOptionVmD視圖模型用來顯示每一個屬性名,該屬性下的屬性值是以Select呈現:

public class PropOptionVmD { public int Id { get; set; } public int PropId { get; set; } public string PropName { get; set; } [Required(ErrorMessage = "必填")] public int PropOptionId { get; set; } }

以上,
○ PropId用來表示屬性Id,在界面中是以隱藏域存在的,會被傳給服務端
○ PropName 表示屬性名,在界面中顯示屬性的名稱
○ PropOptionId 表示界面中被選中的屬性值Id

?

PropOptionVmC視圖模型也用來顯示每一個屬性名,該屬性下的屬性值以CheckBoxList呈現:

public class PropOptionVmC { public int Id { get; set; } public int PropId { get; set; } public string PropName { get; set; } public string PropOptionIds { get; set; } }

?

ProductSKUVm視圖模型用來顯示SKU項中的價格部分:

public class ProductSKUVm { [Display(Name = "價格")] [Required(ErrorMessage = "必填")] [Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} 必須是數字介于 {1} 和 {2}之間.")] public decimal Price { get; set; } public string OptionIds { get; set; } }

以上,
○ Price用來顯示SKU項中的價格
○ OptionIds用來存放SKU項中的所有屬性值編號,以逗號隔開,在界面中以隱藏域存在

?

控制器和視圖實現

?

□ HomeController

?

當呈現Home/Index.cshtml視圖的時候,HomeController應該提供一個方法,把所有的類別放在SelectListItem集合中傳給前臺,并返回一個有關產品視圖模型強類型視圖。

?

當在界面上點擊類別選項,HomeController應該有一個方法接收類別的Id,把該類別下所有的屬性Id以Json格式返回給前臺。

?

當在界面上接收到一個屬性Id集合,需要遍歷屬性Id集合,把每個屬性Id傳給控制器,HomeController應該有一個方法接收屬性Id,在方法內部根據InputType來決定顯示帶Select的視圖,還是帶CheckBoxList的視圖。

?

當點擊界面上的"定價"按鈕,可能需要對屬性值進行笛卡爾乘積,可能不需要,因此,HomeController應該提供2個方法,一個方法用來渲染出需要笛卡爾乘積的視圖,另一個方法用來渲染不需要笛卡爾乘積的視圖。

?

當點擊界面上的"提交"按鈕,HomeController應該提供一個提交產品的方法,該方法接收的參數是有關產品的視圖模型。

?

public class HomeController : Controller { public ActionResult Index() { //把類別封裝成SelectListItem集合傳遞到前臺 var categories = Database.GetCategories(); var result = from c in categories select new SelectListItem() {Text = c.Name, Value = c.Id.ToString()}; ViewData["categories"] = result; return View(new ProductVm()); } //添加產品 [HttpPost] public ActionResult AddProduct(ProductVm productVm) { if (ModelState.IsValid) { //TODO:各種保存 return Json(new { msg = true }); } else { //把類別封裝成SelectListItem集合傳遞到前臺 var categories = Database.GetCategories(); var result = from c in categories select new SelectListItem() { Text = c.Name, Value = c.Id.ToString() }; ViewData["categories"] = result; return RedirectToAction("Index", productVm); } } //根據分類返回分類下的所有屬性Id [HttpPost] public ActionResult GetPropIdsByCategoryId(int categoryId) { var props = Database.GetPropsByCategoryId(categoryId); List<int> propIds = props.Select(p => p.Id).ToList(); return Json(propIds); } //顯示屬性和屬性項的部分視圖 public ActionResult AddPropOption(int propId) { var prop = Database.GetProps().Where(p => p.Id == propId).FirstOrDefault(); var propOptions = Database.GetPropOptionsByPropId(propId); if (prop.InputType == (short) InputTypeEnum.PropDropDownList) { PropOptionVmD propOptionVmD = new PropOptionVmD(); propOptionVmD.PropId = propId; propOptionVmD.PropName = prop.Name; ViewData["propOptionsD"] = from p in propOptions select new SelectListItem() { Text = p.RealValue, Value = p.Id.ToString() }; return PartialView("_AddPropOptionD", propOptionVmD); } else { PropOptionVmC propOptionVmC = new PropOptionVmC(); propOptionVmC.PropId = propId; propOptionVmC.PropName = prop.Name; ViewData["propOptionsC"] = from p in propOptions select new SelectListItem() {Text = p.RealValue, Value = p.Id.ToString()}; return PartialView("_AddPropOptionC", propOptionVmC); } } //當在前臺界面上勾選CheckBoxList選項,點擊"定價"按鈕,就把PropAndOption集合傳到這里 [HttpPost] public ActionResult DisplaySKUs(List<PropAndOption> propAndOptions) { try { //屬性值分組 var groupValues = (from v in propAndOptions group v by v.PropId into grp select grp.Select(t => Database.GetOptionValueById(t.PropOptionId))).ToList(); //屬性值Id分組 var groupIds = (from i in propAndOptions group i by i.PropId into grep select grep.Select(t => t.PropOptionId.ToString())).ToList(); //屬性值分組后進行笛卡爾乘積 IEnumerable<string> values; values = groupValues.First(); groupValues.RemoveAt(0); groupValues.ForEach(delegate(IEnumerable<string> ele) { values = (from v in values from e in ele select v + " " + e).ToList(); }); //屬性值Id分組后進行笛卡爾乘積 IEnumerable<string> ids; ids = groupIds.First(); groupIds.RemoveAt(0); groupIds.ForEach(delegate(IEnumerable<string> ele) { ids = (from i in ids from e in ele select i + "," + e).ToList(); }); //把笛卡爾積后的集合傳遞給前臺 ViewData["v"] = values; ViewData["i"] = ids; } catch (Exception) { throw; } return PartialView("_ShowSKUs"); } //不涉及屬性值的笛卡爾乘積 public ActionResult ShowSKUsWithoutCombination() { ViewData["v"] = null; ViewData["i"] = null; return PartialView("_ShowSKUs"); } }

?

□ Home/Index.cshtml視圖

?

當初次顯示界面的時候,需要把"提交"按鈕隱藏,把"定價"按鈕顯示。

?

當點擊類別下拉框的時候:
1、清空屬性區域
2、清空SKU區域
3、隱藏"定價"按鈕,顯示"提交"按鈕
4、把類別Id異步傳給控制器
5、遍歷從控制器異步傳回的屬性Id的集合,把屬性Id傳給控制器,發送異步請求,返回有關產品屬性和屬性值的強類型部分視圖,并追加到界面"產品屬性"區域

?

當點擊"定價"按鈕:
1、可能"產品屬性"區域有CheckBoxList
??? 1.1 判斷每組CheckBoxList必須至少有一被勾選
??? 1.2 遍歷每個屬性行,遍歷每個被勾選的項,組成類似{ propId: pId, propOptionId: oId }的數組
??? 1.3 把{ propId: pId, propOptionId: oId }的數組以json格式傳給控制器
??? 1.4 異步返回的部分視圖追加到界面的"產品SKU與定價"區域,并給動態加載內容實施異步驗證

2、可能"產品屬性"區域沒有CheckBoxList
??? 2.1 異步加載顯示SKU組合的部分視圖,只顯示一個有關價格的input元素


勾選"產品屬性"區域的CheckBoxList:
1、檢查每組CheckBoxList是否滿足條件,即至少有一項被選中
2、隱藏"定價"按鈕,顯示"提交"按鈕

?

點擊"產品屬性"區域中,每行的"刪除行"按鈕,刪除當前屬性行。

?

@model MvcApplication1.Models.ProductVm @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <div id="wrapper"> @using (Html.BeginForm("AddProduct", "Home", FormMethod.Post, new { id = "addForm" })) { <fieldset> <legend>類別</legend> <div id="categories"> @Html.DropDownListFor(m => m.CategoryId, ViewData["categories"] as IEnumerable<SelectListItem>, "==選擇類別==") @Html.ValidationMessageFor(m => m.CategoryId) </div> </fieldset> <br /> <fieldset> <legend>產品描述</legend> <div id="description"> @Html.LabelFor(m => m.Name) @Html.TextBoxFor(m => m.Name) @Html.ValidationMessageFor(m => m.Name) <br /> <br /> @Html.LabelFor(m => m.Code) @Html.TextBoxFor(m => m.Code) @Html.ValidationMessageFor(m => m.Code) </div> </fieldset> <br /> <fieldset> <legend>產品屬性</legend> <ul id="props"> </ul> </fieldset> <br /> <input type="button" id="displaySKU" value="定價" /> <br /> <fieldset> <legend>產品SKU與定價</legend> <ul id="skus"> </ul> </fieldset> <input type="button" id="up" value="提交" /> } </div> @section scripts { <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> <script src="~/Scripts/dynamicvalidation.js"></script> <script type="text/javascript"> $(function () { //提交按鈕先隱藏直到點擊定價按鈕再顯示 showPriceHideUp(); //點擊類別下拉框 $('#CategoryId').change(function () { changeCategory(); }); //點擊定價按鈕顯示SKU項,以表格顯示,屬性名稱 屬性名稱 價格, //定價按鈕消失,提交按鈕出現 //對每組CheckBoxList進行驗證,保證至少有一個選項勾選 $('#displaySKU').on("click", function () { if ($('#props').find('.c').length) { //判斷屬性和屬性值區域有沒有包含CheckBoxList的li,存在 if (checkCblist()) { //如果所有CheckBoxList組都至少有一項被勾選 //遍歷所有的CheckBoxList的選中項,一個屬性Id帶著1個或多個屬性項Id var propAndOptions = []; //遍歷所有包含CheckBoxList的li $.each($('#props').find('.c'), function () { //從隱藏域中獲取屬性Id <input type="hidden" value="" id='h_v' class='h_v'> var pId = $(this).find('input[type=hidden]').val(); //遍歷每個li中被選中的CheckBox $.each($(this).find("input:checked"), function () { //獲取選中值 var oId = $(this).val(); propAndOptions.push({ propId: pId, propOptionId: oId }); }); }); //異步提交PropAndOption集合 $.ajax({ cache: false, url: '@Url.Action("DisplaySKUs", "Home")', contentType: 'application/json; charset=utf-8', dataType: "html", type: "POST", data: JSON.stringify({ 'propAndOptions': propAndOptions }), success: function (data) { $('#skus').html(data); $.each($('.s'), function (index) { $.validator.unobtrusive.parseDynamicContent(this, "#addForm"); }); hidePriceShowUp(); }, error: function (jqXhr, textStatus, errorThrown) { alert("出錯了 '" + jqXhr.status + "' (狀態: '" + textStatus + "', 錯誤為: '" + errorThrown + "')"); } }); } else { return; } } else {//判斷屬性和屬性值區域有沒有包含CheckBoxList的li,不存在 $.ajax({ cache: false, url: '@Url.Action("ShowSKUsWithoutCombination", "Home")', dataType: "html", type: "GET", success: function (data) { $('#skus').html(data); $.validator.unobtrusive.parseDynamicContent('.s', "#addForm"); hidePriceShowUp(); }, error: function (jqXhr, textStatus, errorThrown) { alert("出錯了 '" + jqXhr.status + "' (狀態: '" + textStatus + "', 錯誤為: '" + errorThrown + "')"); } }); } }); //刪除屬性屬性值行 $('#props').on('click', '.delRow', function() { $(this).parent().parent().remove(); }); //點擊任意CheckBoxList中的選項,定價按鈕出現,提交按鈕隱藏 $('#props').on("change", "input[type=checkbox]", function () { //驗證 checkCblist(); showPriceHideUp(); }); //點擊提交 $('#up').on("click", function () { if (checkCblist) { if ($('#addForm').valid()) { $.ajax({ cache: false, url: '@Url.Action("AddProduct", "Home")', type: 'POST', dataType: 'json', data: $('#addForm').serialize(), success: function (data) { if (data.msg) { alert('提交成功'); } }, error: function (xhr, status) { alert("添加失敗,狀態碼:" + status); } }); } } else { alert("屬性值必須勾選"); } }); }); //點擊類別下拉框 function changeCategory() { //獲取選中的值 var selectedValue = $('#CategoryId option:selected').val(); //如果確實選中 if ($.trim(selectedValue).length > 0) { //清空屬性和屬性項區域 $('#props').empty(); //清空SKU區域 $('#skus').empty(); showPriceHideUp(); //異步請求屬性和屬性項 $.ajax({ url: '@Url.Action("GetPropIdsByCategoryId", "Home")', data: { categoryId: selectedValue }, type: 'post', cache: false, async: false, dataType: 'json', success: function (data) { if (data.length > 0) { $.each(data, function (i, item) { $.get("@Url.Action("AddPropOption", "Home")", { propId: item }, function (result) { $('#props').append(result); }); }); } } }); } } //隱藏定價按鈕 顯示提交按鈕 function hidePriceShowUp() { //隱藏定價按鈕 $('#displaySKU').css("display", "none"); //顯示提交按鈕 $('#up').css("display", "block"); } //顯示定價按鈕 隱藏提交按鈕 function showPriceHideUp(parameters) { $('#displaySKU').css("display", "block"); $('#up').css("display", "none"); } //檢查每組CheckBoxList,如果沒有一個選中,報錯 function checkCblist() { var result = false; //遍歷每組li下的checkboxlist,如果沒有一個選中,報錯 $('#props li').each(function () { if ($(this).find("input:checked").length == 0) { $(this).find('.err').text("至少選擇一項").css("color", "red"); } else { $(this).find('.err').text(""); result = true; } }); return result; } </script> }

?

以上,關于給為動態加載內容實施驗證的dynamicvalidation.js文件,詳細參考這里。

?

//對動態生成內容客戶端驗證 (function ($) { $.validator.unobtrusive.parseDynamicContent = function (selector, formSelector) { $.validator.unobtrusive.parse(selector); var form = $(formSelector); var unobtrusiveValidation = form.data('unobtrusiveValidation'); var validator = form.validate(); $.each(unobtrusiveValidation.options.rules, function (elname, elrules) { if (validator.settings.rules[elname] == undefined) { var args = {}; $.extend(args, elrules); args.messages = unobtrusiveValidation.options.messages[elname]; //edit:use quoted strings for the name selector $("[name='" + elname + "']").rules("add", args); } else { $.each(elrules, function (rulename, data) { if (validator.settings.rules[elname][rulename] == undefined) { var args = {}; args[rulename] = data; args.messages = unobtrusiveValidation.options.messages[elname][rulename]; //edit:use quoted strings for the name selector $("[name='" + elname + "']").rules("add", args); } }); } }); }; })(jQuery);

?

以上,當點擊產品類別,搜集"產品屬性"區域中的勾選項,組成{ propId: pId, propOptionId: oId }數組的時候,這里的propId和propOptionId鍵必須和PropAndOption中的屬性吻合,因為在控制器方法中,接收的是List類型。

public class PropAndOption { public int PropId { get; set; } public int PropOptionId { get; set; } }


□? _AddPropOptionD.cshtml部分視圖

?

當點擊界面上的類別選項,相應屬性下的屬性值以Select顯示,即單選,就來加載這里的視圖,并呈現到界面中的"產品屬性"區域。

?

@using MvcApplication1.Extensions @model MvcApplication1.Models.PropOptionVmD @using (Html.BeginCollectionItem("PropOptionDs")) { <li> <span> @Model.PropName: </span> <span> @Html.DropDownListFor(m => m.PropOptionId, ViewData["propOptionsD"] as IEnumerable<SelectListItem>) </span> <span> @Html.ValidationMessageFor(m => m.PropOptionId) </span> <span> @Html.HiddenFor(m => m.PropId) </span> <span> <a href="javascript:void(0)" class="delRow">刪除行</a> </span> </li> }

?

其中,Html.BeginCollectionItem("PropOptionDs")根據導航屬性生成滿足批量上傳條件的表單元素,詳細介紹在這里。

?

public static class CollectionEditingHtmlExtensions { //目標生成如下格式 //<input autocomplete="off" name="FavouriteMovies.Index" type="hidden" value="6d85a95b-1dee-4175-bfae-73fad6a3763b" /> //<label>Title</label> //<input class="text-box single-line" name="FavouriteMovies[6d85a95b-1dee-4175-bfae-73fad6a3763b].Title" type="text" value="Movie 1" /> //<span class="field-validation-valid"></span> public static IDisposable BeginCollectionItem<TModel>(this HtmlHelper<TModel> html, string collectionName) { //構建name="FavouriteMovies.Index" string collectionIndexFieldName = string.Format("{0}.Index", collectionName); //構建Guid字符串 string itemIndex = GetCollectionItemIndex(collectionIndexFieldName); //構建帶上集合屬性+Guid字符串的前綴 string collectionItemName = string.Format("{0}[{1}]", collectionName, itemIndex); TagBuilder indexField = new TagBuilder("input"); indexField.MergeAttributes(new Dictionary<string, string>() { {"name", string.Format("{0}.Index", collectionName)}, {"value", itemIndex}, {"type", "hidden"}, {"autocomplete", "off"} }); html.ViewContext.Writer.WriteLine(indexField.ToString(TagRenderMode.SelfClosing)); return new CollectionItemNamePrefixScope(html.ViewData.TemplateInfo, collectionItemName); } private class CollectionItemNamePrefixScope : IDisposable { private readonly TemplateInfo _templateInfo; private readonly string _previousPrfix; //通過構造函數,先把TemplateInfo以及TemplateInfo.HtmlFieldPrefix賦值給私有字段變量,并把集合屬性名稱賦值給TemplateInfo.HtmlFieldPrefix public CollectionItemNamePrefixScope(TemplateInfo templateInfo, string collectionItemName) { this._templateInfo = templateInfo; this._previousPrfix = templateInfo.HtmlFieldPrefix; templateInfo.HtmlFieldPrefix = collectionItemName; } public void Dispose() { _templateInfo.HtmlFieldPrefix = _previousPrfix; } } /// <summary> /// /// </summary> /// <param name="collectionIndexFieldName">比如,FavouriteMovies.Index</param> /// <returns>Guid字符串</returns> private static string GetCollectionItemIndex(string collectionIndexFieldName) { Queue<string> previousIndices = (Queue<string>)HttpContext.Current.Items[collectionIndexFieldName]; if (previousIndices == null) { HttpContext.Current.Items[collectionIndexFieldName] = previousIndices = new Queue<string>(); string previousIndicesValues = HttpContext.Current.Request[collectionIndexFieldName]; if (!string.IsNullOrWhiteSpace(previousIndicesValues)) { foreach (string index in previousIndicesValues.Split(',')) { previousIndices.Enqueue(index); } } } return previousIndices.Count > 0 ? previousIndices.Dequeue() : Guid.NewGuid().ToString(); } }


□ _AddPropOptionC.cshtml部分視圖

?

當點擊界面上的類別選項,相應屬性下的屬性值以CheckBoxList顯示,即多選,就來加載這里的視圖,并呈現到界面中的"產品屬性"區域。

?

@using MvcApplication1.Extensions @model MvcApplication1.Models.PropOptionVmC @using (Html.BeginCollectionItem("PropOptionCs")) { <li class="c"> <span> @Model.PropName: </span> <span> @Html.CheckBoxList("PropOptionIds",ViewData["propOptionsC"] as IEnumerable<SelectListItem>,null, 10) <span class="err"></span> </span> <span> @Html.HiddenFor(m => m.PropId) </span> <span> <a href="javascript:void(0)" class="delRow">刪除行</a> </span> </li> }

?

其中,CheckBoxList是基于HtmlHelper的擴展方法,用來呈現水平或垂直分布的CheckBoxList,詳細介紹在這里。

?

using System.Collections.Generic; using System.Linq; using System.Text; namespace System.Web.Mvc { public static class InputExtensions { #region 水平方向CheckBoxList /// <summary> /// 生成水平方向的CheckBoxList /// </summary> /// <param name="htmlHelper"></param> /// <param name="name">name屬性值</param> /// <param name="htmlAttributes">屬性和屬性值的鍵值對集合</param> /// <param name="number">每行顯示的個數</param> /// <returns></returns> public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> listInfo, IDictionary<string, object> htmlAttributes, int number) { //name屬性值必須有 if (string.IsNullOrEmpty(name)) { throw new ArgumentException("必須給CheckBoxList一個name值", "name"); } //數據源SelectListItem的集合必須有 if (listInfo == null) { throw new ArgumentNullException("listInfo", "List<SelectListItem>類型的listInfo參數不能為null"); } //數據源中必須有數據 if (!listInfo.Any()) { throw new ArgumentException("List<SelectListItem>類型的listInfo參數必須有數據", "listInfo"); } //準備拼接 var sb = new StringBuilder(); //每行CheckBox開始數數 var lineNumber = 0; //遍歷數據源 foreach (var info in listInfo) { lineNumber++; //創建type=checkbox的input var builder = new TagBuilder("input"); //tag設置屬性 if (info.Selected) { builder.MergeAttribute("checked", "checked"); } builder.MergeAttributes(htmlAttributes); builder.MergeAttribute("type", "checkbox"); builder.MergeAttribute("value", info.Value); builder.MergeAttribute("name", name); builder.MergeAttribute("id", string.Format("{0}_{1}", name, info.Value)); sb.Append(builder.ToString(TagRenderMode.Normal)); //創建checkbox的顯示值 var lableBuilder = new TagBuilder("label"); lableBuilder.MergeAttribute("for", string.Format("{0}_{1}", name, info.Value)); lableBuilder.InnerHtml = info.Text; sb.Append(lableBuilder.ToString(TagRenderMode.Normal)); //如果設置的每行數量剛好被當前數量整除就換行 if (lineNumber == 0 || (lineNumber % number == 0)) { sb.Append("<br />"); } } return MvcHtmlString.Create(sb.ToString()); } /// <summary> /// 重載,不包含屬性和屬性值鍵值對的集合 /// </summary> /// <param name="htmlHelper"></param> /// <param name="name">name的屬性值</param> /// <param name="listInfor">SelectListItem集合類型的數據源</param> /// <returns></returns> public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> listInfor) { return htmlHelper.CheckBoxList(name, listInfor, null, 5); } #endregion #region 垂直方向CheckBoxList public static MvcHtmlString CheckBoxListVertical(this HtmlHelper htmlHelper, string name, IEnumerable<SelectListItem> listInfo, IDictionary<string, object> htmlAttributes, int columnNumber = 1) { //name屬性值不能為null if (string.IsNullOrEmpty(name)) { throw new ArgumentException("必須給CheckBoxList的name屬性賦值","name"); } //數據源不能為null if (listInfo == null) { throw new ArgumentNullException("listInfo","List<SelectListItem>類型的listInfo參數不能為null"); } //數據源中必須有數據 if (!listInfo.Any()) { throw new ArgumentException("List<SelectListItem>類型的參數listInfo必須有數據","listInfo"); } //數據源數據項的數量 var dataCount = listInfo.Count(); //得到行數 var rows = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(dataCount) / Convert.ToDecimal(columnNumber))); //創建div var wrapBuilder = new TagBuilder("div"); wrapBuilder.MergeAttribute("style", "float:left; line-height:25px; padding-right:5px;"); var wrapStart = wrapBuilder.ToString(TagRenderMode.StartTag); var wrapClose = string.Concat(wrapBuilder.ToString(TagRenderMode.EndTag), " <div style=\"clear:both;\"></div>"); var wrapBreak = string.Concat("</div>", wrapBuilder.ToString(TagRenderMode.StartTag)); var sb = new StringBuilder(); sb.Append(wrapStart); var lineNumber = 0; //遍歷數據源 foreach (var info in listInfo) { var builder = new TagBuilder("input"); if (info.Selected) { builder.MergeAttribute("checked", "checked"); } builder.MergeAttributes(htmlAttributes); builder.MergeAttribute("type", "checkbox"); builder.MergeAttribute("value", info.Value); builder.MergeAttribute("name", name); builder.MergeAttribute("id", string.Format("{0}_{1}", name, info.Value)); sb.Append(builder.ToString(TagRenderMode.Normal)); var labelBuilder = new TagBuilder("label"); labelBuilder.MergeAttribute("for", string.Format("{0}_{1}", name, info.Value)); labelBuilder.InnerHtml = info.Text; sb.Append(labelBuilder.ToString(TagRenderMode.Normal)); lineNumber++; if (lineNumber.Equals(rows)) { sb.Append(wrapBreak); lineNumber = 0; } else { sb.Append("<br />"); } } sb.Append(wrapClose); return MvcHtmlString.Create(sb.ToString()); } #endregion } }

?

□ _ShowSKUs.cshtml部分視圖

?

當點擊界面上的"定價"按鈕,就來加載這個視圖,如果屬性值笛卡爾乘積為null,那就只顯示一個有關價格的input元素。如果確實存在屬性值笛卡爾乘積,就遍歷這些SKU項顯示出來,并且,每遍歷一次,就去加載有關產品價格的強類型部分視圖。

?

@if (ViewData["v"] == null) { <li> <span class="s"> @{ ProductSKUVm productSkuVm = new ProductSKUVm(); productSkuVm.OptionIds = ""; Html.RenderPartial("_SKUDetail", productSkuVm); } </span> </li> } else { string[] values = (ViewData["v"] as IEnumerable<string>).ToArray(); string[] ids = (ViewData["i"] as IEnumerable<string>).ToArray(); for (int i = 0; i < values.Count(); i++) { <li> <span> @values[@i] </span> <span class="s"> @{ ProductSKUVm productSkuVm = new ProductSKUVm(); productSkuVm.OptionIds = ids[@i]; Html.RenderPartial("_SKUDetail", productSkuVm); } </span> </li> } }

?

□ _SKUDetail.cshtml強類型部分視圖

?

作為_ShowSKUs.cshtml部分視圖的子部分視圖,用來顯示產品價格相關的強類型部分視圖。

@using MvcApplication1.Extensions @model MvcApplication1.Models.ProductSKUVm @using (Html.BeginCollectionItem("ProductSKUs")) { @Html.TextBoxFor(m => m.Price) @Html.ValidationMessageFor(m => m.Price) @Html.HiddenFor(m => m.OptionIds) }

?

□ 模擬數據庫存儲的Database類

?

展開 public class Database{#region 關于分類public static List<Category> GetCategories(){return new List<Category>(){new Category(){Id = 1, Name = "家電"},new Category(){Id = 2, Name = "家具"}};} #endregion#region 關于屬性public static List<Prop> GetProps(){var category1 = GetCategories().Where(c => c.Id == 1).FirstOrDefault();var category2 = GetCategories().Where(c => c.Id == 2).FirstOrDefault();return new List<Prop>(){new Prop(){Id = 1, Name = "重量",InputType = (short)InputTypeEnum.PropDropDownList,CategoryId = category1.Id, Category = category1},new Prop(){Id = 2, Name = "尺寸",InputType = (short)InputTypeEnum.PropCheckBoxList,CategoryId = category1.Id, Category = category1},new Prop(){Id = 3, Name = "顏色",InputType = (short)InputTypeEnum.PropCheckBoxList,CategoryId = category1.Id, Category = category1},new Prop(){Id = 4, Name = "成份",InputType = (short)InputTypeEnum.PropDropDownList,CategoryId = category2.Id, Category = category2}};}public static List<Prop> GetPropsByCategoryId(int categoryId){return GetProps().Where(p => p.CategoryId == categoryId).ToList();} #endregion#region 關于屬性值public static List<PropOption> GetPropOptions(){var prop1 = GetProps().Where(p => p.Id == 1).FirstOrDefault(); //重量var prop2 = GetProps().Where(p => p.Id == 2).FirstOrDefault(); //尺寸var prop3 = GetProps().Where(p => p.Id == 3).FirstOrDefault(); //顏色var prop4 = GetProps().Where(p => p.Id == 4).FirstOrDefault(); //成份return new List<PropOption>(){//重量的屬性值new PropOption(){Id = 1, Prop = prop1, PropId = prop1.Id, RealValue = "5kg"},new PropOption(){Id = 2, Prop = prop1, PropId = prop1.Id, RealValue = "10kg"},//尺寸的屬性值new PropOption(){Id = 3, Prop = prop2, PropId = prop2.Id, RealValue = "10英寸"},new PropOption(){Id = 4, Prop = prop2, PropId = prop2.Id, RealValue = "12英寸"},new PropOption(){Id = 5, Prop = prop2, PropId = prop2.Id, RealValue = "15英寸"},//顏色的屬性值new PropOption(){Id = 6, Prop = prop3, PropId = prop3.Id, RealValue = "玫紅色"},new PropOption(){Id = 7, Prop = prop3, PropId = prop3.Id, RealValue = "圣誕白"},new PropOption(){Id = 8, Prop = prop3, PropId = prop3.Id, RealValue = "宇宙光"},new PropOption(){Id = 9, Prop = prop3, PropId = prop3.Id, RealValue = "絢爛橙"},//成份的屬性值new PropOption(){Id = 10, Prop = prop4, PropId = prop4.Id, RealValue = "實木"},new PropOption(){Id = 11, Prop = prop4, PropId = prop4.Id, RealValue = "橡木"},};}//根據屬性Id獲取所有屬性值public static List<PropOption> GetPropOptionsByPropId(int propId){return GetPropOptions().Where(p => p.PropId == propId).ToList();}//根據屬性值Id獲取屬性值public static string GetOptionValueById(int optionId){return (GetPropOptions().Where(p => p.Id == optionId).FirstOrDefault()).RealValue;}#endregion}

?

結束!

?

?

?

?

?

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/darrenji/p/4110219.html

總結

以上是生活随笔為你收集整理的ASP.NET MVC中商品模块小样的全部內容,希望文章能夠幫你解決所遇到的問題。

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

日韩电影在线视频 | 国产在线黄色 | 久久免费毛片 | 日日婷婷夜日日天干 | 日本精品一区二区 | 婷婷丁香导航 | 欧美片一区二区三区 | 99re国产| 日韩欧美视频在线免费观看 | 国产午夜影院 | 久久久久久久久久久久久久免费看 | 在线看国产视频 | 五月婷婷激情六月 | 免费成人av电影 | 精品国产欧美一区二区三区不卡 | 亚洲日本va午夜在线电影 | 亚洲视频在线观看网站 | 日日综合| 欧美国产精品一区二区 | 久久视频 | 日韩av网页 | 最近中文字幕大全中文字幕免费 | 国产成人免费高清 | 亚洲精选在线观看 | 日韩视频三区 | 99麻豆视频 | 日韩黄色在线观看 | 日韩在线国产精品 | 日韩成片 | 免费在线观看不卡av | 国产精品资源 | 91精品久久久久久粉嫩 | 伊人在线视频 | 国产高清视频在线播放一区 | 亚洲精品视频在线免费 | 超碰国产在线 | 人成午夜视频 | 一本一本久久a久久精品综合 | 中文字幕日韩高清 | 日本在线免费看 | 高清av中文字幕 | 欧美视频日韩视频 | 97日日碰人人模人人澡分享吧 | 91九色蝌蚪视频 | 欧美精品久久久久久久久久丰满 | 久久成人麻豆午夜电影 | 日韩在线视频一区二区三区 | 最近乱久中文字幕 | 欧美日韩在线视频免费 | 手机av在线免费观看 | 亚洲午夜精品电影 | 久久久久| 一本之道乱码区 | 国产精品美女免费视频 | 国产天天综合 | 四虎国产精品免费观看视频优播 | av色网站 | 久久精品美女 | 黄色av成人在线 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 亚洲永久精品在线 | 蜜臀av免费一区二区三区 | www.久久色 | 亚洲免费视频观看 | 2022久久国产露脸精品国产 | 国产精品中文字幕av | 夜夜骑日日 | 就要干b | 久久综合一本 | 久草在线费播放视频 | 中文字幕在线网 | 日本黄色大片免费看 | 成人黄色在线视频 | 国产黄色看片 | 三级在线国产 | av在线h| 91女人18片女毛片60分钟 | a视频在线 | 日本中文字幕电影在线免费观看 | 免费色网站 | 99视频在线观看一区三区 | 91精彩视频 | 中文字幕高清av | 黄色一级性片 | 欧美日韩a视频 | 精品亚洲免费 | 99这里只有| 亚洲黄电影| 黄色大片视频网站 | 在线观看黄网站 | 亚洲精品国精品久久99热一 | 日韩高清国产精品 | 99精品视频免费看 | 在线久热| 国产高清永久免费 | 国产美腿白丝袜足在线av | 国产精品涩涩屋www在线观看 | 日一日操一操 | 国产精品国产三级国产aⅴ入口 | 91精品日韩 | 久久精品免费播放 | 精品超碰 | 国产一区二区观看 | 精品久久网 | 有没有在线观看av | 亚洲黄在线观看 | 中文字幕在线日 | 色吊丝在线永久观看最新版本 | 69久久久久久久 | 国产精品美女视频 | www色com | 7777精品伊人久久久大香线蕉 | 亚洲国产合集 | 免费日韩电影 | 一区二区三区四区不卡 | av高清免费在线 | 一区在线播放 | 国产精品九九九九九九 | 中文字幕中文中文字幕 | 91成人在线看| 国产精品免费高清 | 亚洲va欧美va人人爽春色影视 | 天天操天天舔天天爽 | 欧美精品乱码久久久久久按摩 | 欧美老少交 | 蜜桃视频在线视频 | 香蕉在线视频观看 | 久久久国产精品网站 | 久久久久国产精品厨房 | 岛国av在线免费 | 麻豆影视网 | 日韩精品一区二区三区丰满 | 在线之家免费在线观看电影 | 欧美极品少妇xxxx | 国产区高清在线 | 97人人艹| 久久国产精品免费视频 | 久久国产精品99精国产 | 97中文字幕 | 免费日韩精品 | 国产亚洲久一区二区 | 国产福利午夜 | 久草精品视频在线看网站免费 | 国产精品久久久av久久久 | 天天做天天爱天天综合网 | 国产 视频 高清 免费 | 伊人六月 | 激情视频免费在线 | 在线播放视频一区 | 久久国产欧美日韩精品 | ,午夜性刺激免费看视频 | 在线你懂的视频 | 亚洲黄网站| 亚洲性少妇性猛交wwww乱大交 | 日韩久久午夜一级啪啪 | av成年人电影 | 91在线欧美 | 国产福利久久 | 香蕉视频4aa | www.亚洲视频.com | 综合国产在线观看 | 国产美女视频免费观看的网站 | 欧美色婷| 蜜臀av在线一区二区三区 | 国产精品a久久久久 | 麻豆久久久久久久 | 国产精品大片 | 日韩sese| 中文字幕av最新更新 | www视频免费在线观看 | 国产日韩精品视频 | 女人高潮一级片 | 国产精品精品国产婷婷这里av | 久久午夜网 | 美女久久久久久久久久久 | 永久免费精品视频 | 黄色片亚洲 | 国产精品破处视频 | 一区免费在线 | 狠狠狠色丁香婷婷综合激情 | 91在线超碰 | 日操操| 亚洲精品网站 | 国产精品久久毛片 | 午夜av影院 | 国产在线精品区 | 亚洲女人天堂成人av在线 | 国产一区二区不卡视频 | 精品国产精品久久一区免费式 | 99久久精品国产免费看不卡 | 丁香花在线观看免费完整版视频 | 国产精品亚州 | 欧美日韩破处 | 91色亚洲 | 99视频在线精品免费观看2 | 久久综合精品国产一区二区三区 | 中文一区在线观看 | 中文字幕国产一区 | 色综合天天在线 | 在线看片一区 | 黄色免费在线看 | 成在线播放 | 麻豆视频在线观看免费 | 99成人免费视频 | 亚洲精品综合一二三区在线观看 | 婷婷色网| 97超视频在线观看 | 最近2019年日本中文免费字幕 | 青草视频网 | 波多野结衣电影一区二区三区 | 国产999视频在线观看 | 少妇bbbb揉bbbb日本 | 91在线免费播放 | 亚洲精品高清视频在线观看 | 久久久久一区二区三区 | 久久国产麻豆 | 国产精品热视频 | 99久久精品视频免费 | 亚洲 欧美 变态 国产 另类 | 久久久久国产成人精品亚洲午夜 | 黄色福利网站 | 国产片免费在线观看视频 | 国产美女免费观看 | 黄a在线看 | 久草在线视频首页 | 色婷婷狠狠五月综合天色拍 | 欧美精品久 | 探花视频在线版播放免费观看 | 国产精品久久久久久电影 | 欧美日韩中文字幕在线视频 | 久久免费视频2 | 97小视频| 欧美日韩一区二区免费在线观看 | 免费看一级特黄a大片 | 亚洲精品在线观看不卡 | 狠狠激情中文字幕 | 最近中文字幕免费观看 | 五月婷亚洲 | 久久久综合 | 国产精品美女毛片真酒店 | 亚洲美女免费精品视频在线观看 | 国产成人高清 | 日韩欧美xxxx | 亚洲精品18日本一区app | 亚洲黄色小说网址 | 久久在线免费观看 | 狠狠色噜噜狠狠狠 | 国产最顶级的黄色片在线免费观看 | 欧美巨大荫蒂茸毛毛人妖 | 亚洲精品高清在线观看 | 亚洲视频电影在线 | 少妇精品久久久一区二区免费 | 亚洲天堂在线观看完整版 | 国产精品久久久久三级 | 99久久婷婷国产 | 国产精品久久久久三级 | 黄色毛片一级 | 黄色小网站免费看 | av免费看av| 黄色av成人在线观看 | 色综合天天在线 | 综合网伊人 | 精品一区二区三区四区在线 | 亚洲黄色激情小说 | 婷婷久久一区二区三区 | 欧美韩国日本在线 | 成人av动漫在线 | 国内丰满少妇猛烈精品播 | 国产精品 视频 | 最近字幕在线观看第一季 | 午夜视频播放 | 亚洲成人精品久久 | 国产精品美女视频 | 欧美精品久久久久久久免费 | 在线国产小视频 | 中文字幕色站 | av不卡中文字幕 | 97精品在线观看 | 91高清免费观看 | 最近高清中文在线字幕在线观看 | 免费看在线看www777 | 午夜资源站 | 国产精品国产三级国产aⅴ无密码 | 精品一区av| 亚洲精品国产麻豆 | 成 人 黄 色 片 在线播放 | 国产午夜激情视频 | 国产精品亚洲成人 | 天天操天天舔天天爽 | 一级免费黄视频 | 日韩免费视频网站 | 日韩欧美视频免费观看 | 91高清视频在线 | 婷婷色综| 免费在线激情电影 | av在线直接看 | 日本激情视频中文字幕 | 日韩区欧美久久久无人区 | 超碰国产在线播放 | 欧美日韩精品在线播放 | 女女av在线| 国内精品久久久久久久久久清纯 | 色视频网站免费观看 | 国产视频在线观看一区二区 | 中文字幕在线高清 | 久青草影院 | 欧美视频日韩视频 | 久久专区| 日韩欧美在线影院 | 日韩在线观看 | 五月婷在线播放 | 91福利国产在线观看 | 午夜私人影院久久久久 | 三级黄色欧美 | 午夜免费视频网站 | 色干综合 | 亚洲视频第一页 | 在线观看电影av | 四虎在线免费视频 | av在线播放网址 | 日韩电影一区二区三区在线观看 | 一级黄色片在线观看 | www日韩欧美 | 日本中文一区二区 | 在线播放国产一区二区三区 | 麻豆视频一区 | 怡红院久久 | 在线精品一区二区 | 欧美日韩p片 | 国产精品九九九九九九 | 99久久综合国产精品二区 | 99热这里精品 | 成人a v视频 | 亚洲天堂网在线视频 | 久久综合中文色婷婷 | 午夜精品一区二区三区在线播放 | 国产高清免费在线观看 | 久久精品免视看 | 欧美亚洲三级 | 欧美日韩一区二区免费在线观看 | 99精品视频在线播放免费 | 国产不卡免费视频 | 天天干天天射天天插 | 亚洲va韩国va欧美va精四季 | 欧美性超爽 | 久久艹在线 | av在线日韩 | 久久精品一区二区三区中文字幕 | 婷婷av资源 | 日韩欧美69 | 九九99 | 夜夜操天天摸 | 乱男乱女www7788 | 久久久久成人精品免费播放动漫 | 久久激情小视频 | 亚洲精品视频在线免费播放 | 亚洲精选在线 | 亚洲 中文 欧美 日韩vr 在线 | 国产精品区一区 | 国产成人精品久久久久蜜臀 | 免费看的毛片 | 亚洲午夜精品一区二区三区电影院 | 欧美精品国产综合久久 | 久久久久久黄 | 91资源在线播放 | 国产精品99久久久精品 | 黄色视屏在线免费观看 | 波多野结衣一区三区 | 国产一二三区av | 99高清视频有精品视频 | 中文字幕亚洲精品日韩 | 国产高清免费在线观看 | 国产精品成人一区二区三区吃奶 | 国产男女无遮挡猛进猛出在线观看 | 在线视频1卡二卡三卡 | av免费电影网站 | 91精选在线| 天天干夜夜想 | 欧美 日韩 国产 成人 在线 | 久久久这里有精品 | 伊人色综合网 | 成年人黄色免费网站 | aaa日本高清在线播放免费观看 | 成人久久久久久久久久 | 免费网站黄 | 亚洲欧洲精品久久 | 亚洲国产精品久久久久婷婷884 | 亚洲黄色软件 | 久久久精品欧美一区二区免费 | 99亚洲国产 | 亚洲欧美国内爽妇网 | 丁香视频在线观看 | 91女神的呻吟细腰翘臀美女 | 精品国产1区2区3区 国产欧美精品在线观看 | 91亚洲精品国产 | 免费观看特级毛片 | 91在线精品一区二区 | 日韩精选在线观看 | 亚洲日本在线视频观看 | 人人超碰人人 | 国产日本在线 | 五月婷婷毛片 | 日p视频 | 久久精品日产第一区二区三区乱码 | 超碰在线97观看 | 久久人人精 | 久久精品福利 | 玖玖在线免费视频 | 欧美日韩在线观看不卡 | 五月婷香蕉久色在线看 | 日韩免费av网址 | 久久亚洲视频 | 免费在线观看的av网站 | 国产不卡精品 | 在线视频一区二区 | 中文字幕高清免费日韩视频在线 | 91免费高清视频 | 久久精品一区二区三区国产主播 | 久久艹国产 | 久久avav| 一区二区三区四区五区在线 | 中文国产在线观看 | 91久久精品一区 | 97超碰在线视| 日韩一区二区三区观看 | 91香蕉视频好色先生 | 国产精品久久久久一区二区三区共 | 天天天色综合a | 奇米777777 | 天天爽夜夜操 | 永久免费精品视频网站 | 在线观看91精品国产网站 | 综合色影院 | 久久综合国产伦精品免费 | 日韩高清不卡一区二区三区 | 国产精品刺激对白麻豆99 | 日韩精品久久久久久久电影竹菊 | 夜夜操网 | 亚洲影视九九影院在线观看 | 一区二区视频免费在线观看 | 精品99久久 | 成人一区二区在线 | 国产一区二区电影在线观看 | 亚洲欧美婷婷六月色综合 | av资源免费观看 | 欧洲色综合 | 精品亚洲男同gayvideo网站 | 亚洲国产精选 | 夜夜澡人模人人添人人看 | 欧美激情xxxx性bbbb | 国产精品久久精品国产 | 婷婷丁香在线观看 | 免费在线成人 | 中文久久精品 | 成人少妇影院yyyy | 久草在线这里只有精品 | 久久特级毛片 | 毛片久久久 | 美女网站色在线观看 | 国产拍揄自揄精品视频麻豆 | 国产精品乱码久久 | av性网站 | 91日韩精品一区 | 日韩精品亚洲专区在线观看 | 日本精品久久久久影院 | 99视频精品免费观看, | 欧美粗又大 | 最新亚洲视频 | 日韩69视频 | av高清在线 | 国产精品高潮久久av | 亚洲另类视频 | 婷婷久月| 久久99中文字幕 | 亚洲精品在线一区二区三区 | 有码中文在线 | 黄色成人av在线 | 最新国产精品久久精品 | 五月婷婷色丁香 | 人人插人人搞 | 久久成人国产精品入口 | 色吊丝在线永久观看最新版本 | 中文字幕在线播放日韩 | 五月天婷亚洲天综合网鲁鲁鲁 | 波多野结衣视频网址 | 国产精品专区在线观看 | 成人黄色在线 | 久久综合桃花 | 国产69精品久久久久久 | 六月丁香激情综合色啪小说 | 日韩在线观看网址 | 久久夜av| 日本在线观看一区二区三区 | 亚洲免费视频在线观看 | 在线免费观看视频一区二区三区 | 亚洲一级理论片 | 色吊丝在线永久观看最新版本 | 久久久久久久国产精品影院 | 深爱激情站 | 精品国自产在线观看 | 激情综合亚洲精品 | 国产精品夜夜夜一区二区三区尤 | 国产99在线播放 | 精品国产伦一区二区三区 | 国内精品久久久久久久久久清纯 | 91网页版免费观看 | 97在线精品国自产拍中文 | 久久国产精品久久精品国产演员表 | 午夜精品久久久久久久99水蜜桃 | 国产黄大片在线观看 | 成人av一级片 | 欧美专区国产专区 | 亚洲激情国产精品 | 一区二区三区免费在线观看视频 | 日韩免费不卡视频 | 91x色 | 欧美va天堂在线电影 | 极品久久久久 | 久久国产精品99久久久久久丝袜 | 国产亚洲永久域名 | 国产视频在线免费 | 在线观看午夜 | 激情伊人五月天 | 午夜黄色一级片 | 久久国内精品 | 美女网站免费福利视频 | 日韩影视在线观看 | 亚洲精品在线一区二区三区 | 99国内精品久久久久久久 | 四虎在线永久免费观看 | 欧洲视频一区 | 久久9视频| 欧美嫩草影院 | 日韩有码第一页 | 婷婷久久五月天 | 久久免费a | 三级av黄色 | 免费又黄又爽视频 | 好看的国产精品视频 | 成在人线av | 欧美日韩在线视频一区 | 国产麻豆精品免费视频 | 最近中文字幕大全中文字幕免费 | 色婷婷电影 | 偷拍视频一区 | 天天干天天操天天搞 | 最新婷婷色 | 免费看黄色小说的网站 | 久久久久五月天 | av中文在线| 国产精品中文在线 | 国产99在线免费 | 九九三级毛片 | 国产一级高清 | 91人人揉日日捏人人看 | 日日夜夜精品视频天天综合网 | 91高清视频 | 五月天中文字幕mv在线 | 欧美综合在线观看 | 久草视频在线观 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲人xxx| 免费看黄在线看 | 五月色丁香 | 国产精品一区二区三区免费看 | 五月天亚洲激情 | 国产一区免费观看 | bbw av| 久久久这里有精品 | 久久精品之 | 国产青青青 | 亚洲精品免费观看 | 欧美日本中文字幕 | 国产精品久久久久四虎 | 国产一二区免费视频 | av在线网站免费观看 | 国产精品视频大全 | 日韩av在线影视 | 天堂av在线网址 | 97视频免费观看 | 黄色app网站在线观看 | 国产精彩视频一区 | 免费黄色在线播放 | 干狠狠| 久久国产一区二区 | 91av在线播放视频 | 国产精品欧美久久久久久 | 久草97| 久青草影院 | 欧美男女爱爱视频 | 欧美久久久久久久久久 | 久久伊人精品天天 | 婷婷色综合 | 日韩免费观看一区二区 | 色偷偷88888欧美精品久久久 | 久久久久福利视频 | 91丨九色丨91啦蝌蚪老版 | 人人插人人搞 | 国产最顶级的黄色片在线免费观看 | 中文字幕国产精品一区二区 | 久久精品久久99 | 黄色一级性片 | 在线观看黄 | 国产玖玖精品视频 | 91精品国产自产在线观看 | 黄色免费高清视频 | 国产精品久久久久久久毛片 | 日韩亚洲欧美中文字幕 | 久久永久视频 | 五月婷婷综合激情网 | 九九交易行官网 | 久久9999久久 | 亚洲成人精品av | 婷婷激情综合 | 免费视频三区 | 欧美日韩在线视频一区二区 | 午夜免费在线观看 | 国产欧美在线一区 | 91久久精品一区 | 国产成人福利在线观看 | 免费看av片网站 | 日韩欧美高清 | 6699私人影院 | 在线小视频 | 手机成人av在线 | 99在线免费观看视频 | 91精品少妇偷拍99 | 久草在线视频免赞 | 久久精品福利视频 | 免费黄在线看 | 国产精品久久久久久久久免费看 | 6080yy精品一区二区三区 | 免费久久99精品国产婷婷六月 | 欧美国产三区 | 国产精品一区久久久久 | 九九热视频在线播放 | 亚洲男男gaygayxxxgv | 特级西西444www大胆高清无视频 | 狠狠天天| 波多野结衣在线观看视频 | 日韩婷婷 | av色网站| 二区在线播放 | 激情五月六月婷婷 | 中文字幕三区 | 一本一本久久a久久精品综合小说 | 日韩在线观看精品 | 久久国产精品偷 | av免费网站 | 免费av大全 | 国产精品欧美一区二区三区不卡 | 91色在线观看 | 亚洲高清av | 成 人 黄 色 视频 免费观看 | 国产亚洲欧美一区 | 亚洲综合在线观看视频 | 久久99国产精品免费网站 | 国产精品一区二区在线观看免费 | 夜夜视频 | 夜夜夜夜操| 91福利区一区二区三区 | 国产成人精品综合 | 国产精品视频99 | 国产在线精品视频 | 精品在线观看一区二区 | 亚洲午夜久久久久久久久 | 狠狠色丁香婷婷综合最新地址 | av成人免费网站 | 国产专区在线播放 | 激情欧美丁香 | 在线观看成人一级片 | 福利视频一区二区 | 久久久久久国产精品美女 | 成人午夜精品福利免费 | 97色国产| 国产精品美女视频网站 | 特级a老妇做爰全过程 | 免费下载高清毛片 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 9999在线观看| 国产高清免费 | 蜜臀av夜夜澡人人爽人人桃色 | 亚洲免费精彩视频 | 综合久久精品 | 久久综合欧美精品亚洲一区 | 久久女同性恋中文字幕 | 午夜久久影院 | 国产免费观看视频 | 久久久久电影网站 | 99精品久久久久久久 | av天天色| 麻花天美星空视频 | 色偷偷人人澡久久超碰69 | 毛片网站在线看 | 狠狠色综合欧美激情 | 干干夜夜 | 亚洲永久精品在线观看 | 人人爽人人爽人人爽 | 国产亚洲精品久久久久久久久久久久 | 欧美日本不卡 | 日本精品在线看 | 激情五月婷婷 | 国产不卡av在线 | 中文字幕国产精品一区二区 | 少妇资源站 | 日韩欧美在线综合网 | 久热久草在线 | 天天射,天天干 | 亚洲欧洲精品久久 | 精品不卡视频 | 国产免费又粗又猛又爽 | 不卡电影免费在线播放一区 | 日本三级久久久 | 美女免费视频一区 | 精品国产精品一区二区夜夜嗨 | 伊人天堂av | 黄色在线成人 | 人人插人人爱 | 黄色软件在线观看 | 久草亚洲视频 | 丁香六月久久综合狠狠色 | 国产日韩精品久久 | 欧美精品九九 | 亚洲精品午夜久久久久久久久久久 | 色综合小说 | 在线观看黄网 | 国产精品久久久久av免费 | 一本色道久久精品 | 免费黄色网址网站 | 亚洲视频在线观看 | 一级一片免费视频 | 久久免费视频4 | 一本之道乱码区 | 日韩字幕在线 | 中文字幕久久精品亚洲乱码 | 丁香激情综合久久伊人久久 | 西西www4444大胆视频 | 亚洲黄色在线免费观看 | 天天色天天干天天 | 波多野结衣一区二区三区中文字幕 | 国产亚洲一级高清 | 久久久久精 | 国产黄色观看 | 九九在线视频免费观看 | 久草| 久久99在线观看 | 国产成人在线免费观看 | 日韩三级视频在线观看 | 日韩在线播放av | 九色视频网 | 成片免费观看视频999 | 久久99热久久99精品 | 久久在线视频精品 | 麻豆传媒精品 | 黄色亚洲精品 | 国产一级片在线播放 | 在线观看www91 | 婷五月天激情 | 成人影视免费看 | 亚洲特级片 | 亚洲三级在线播放 | 亚洲精品视频在线播放 | 亚洲国产中文字幕在线观看 | 91九色视频| 国内精品视频在线 | 黄色成年网站 | 亚洲精品一区二区三区高潮 | 国产精品久久99精品毛片三a | 亚洲视频六区 | 久久99久久99精品免视看婷婷 | 日韩sese| 成人福利在线播放 | 在线之家免费在线观看电影 | 香蕉网站在线观看 | 天堂av影院 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲精品视频网 | 亚洲aaa毛片 | 黄色一级片视频 | 精品在线小视频 | 日本中文字幕在线观看 | 国产专区在线 | 国产一区福利在线 | 国产视频中文字幕 | 国产精品自拍在线 | 久久久久久久久久久国产精品 | 伊人狠狠色丁香婷婷综合 | 日本 在线 视频 中文 有码 | 久久久久久美女 | 在线高清 | 亚洲免费公开视频 | 久草在线免费看视频 | 免费看污在线观看 | 三级小视频在线观看 | 国产伦精品一区二区三区免费 | 国产在线v| 国产一区二区中文字幕 | 久久久国产影视 | 国产在线国偷精品产拍免费yy | 五月天com | 中文字幕不卡在线88 | 日本黄色免费在线 | 国产一级电影免费观看 | 国内久久久久 | 中文字幕一区二区三区乱码不卡 | 久久天堂亚洲 | 国产一级做a爱片久久毛片a | 人人添人人澡 | 特级毛片aaa | 色偷偷av男人天堂 | 成人一区影院 | 一区二区三区日韩在线 | 国产二区免费视频 | 综合色中色 | 精品国产一区二区三区不卡 | 国产午夜不卡 | 免费十分钟 | 成年人在线观看网站 | 精品国精品自拍自在线 | 黄色成人在线网站 | 日本精品中文字幕在线观看 | 日韩一二区在线观看 | 日本mv大片欧洲mv大片 | 日日夜日日干 | 欧美日韩久久久 | 日韩av区| 99国产精品久久久久老师 | 天天干天天做天天操 | 国产黄色大全 | 久久久影院一区二区三区 | 五月天婷婷在线播放 | 亚洲每日更新 | 91成人精品一区在线播放69 | 91热这里只有精品 | 在线国产黄色 | 911久久香蕉国产线看观看 | 精品九九九 | 国产你懂的在线 | 国产免费又爽又刺激在线观看 | 日韩欧美极品 | 久久久久久久综合色一本 | 91日韩在线播放 | 色中色资源站 | 欧美日韩一区二区三区视频 | 久久久久亚洲精品中文字幕 | 精品福利网站 | 精品久久久久久久久久久久久久久久 | 日本精品va在线观看 | 日韩av在线资源 | 亚洲九九九 | 免费a级毛片在线看 | 国产精品欧美一区二区 | 久久人人97超碰精品888 | 日日夜夜骑 | 亚洲一区二区三区毛片 | 99国产精品免费网站 | 亚洲每日更新 | 99热99re6国产在线播放 | 天天曰视频 | 91免费的视频在线播放 | 国产精品videossex国产高清 | 福利网址在线观看 | 中文字幕日韩高清 | 黄污网站在线观看 | 国产亚洲永久域名 | 精品久久在线 | 久久国产欧美日韩精品 | 国产一区观看 | 97自拍超碰| 国产亚洲日本 | 日韩在线视频免费观看 | 成片人卡1卡2卡3手机免费看 | 丝袜制服天堂 | 久久久天堂 | 亚洲婷婷网 | 中文字幕在线观看2018 | 深爱婷婷激情 | 国产精品毛片一区二区三区 | 97人人看 | 日韩免费在线观看视频 | 欧美性受极品xxxx喷水 | 丁香六月在线观看 | 欧美午夜a | 欧美在线一二 | 麻豆国产精品va在线观看不卡 | 久久99婷婷 | 亚洲区视频在线 | 精品色999 | 99婷婷 | 欧美日韩在线视频一区二区 | 久久久香蕉视频 | 国产一区视频免费在线观看 | 成人免费视频网 | 18女毛片 | 亚洲日本国产 | 亚洲成人av在线电影 | 91亚洲综合 | 在线播放第一页 | 天堂av在线免费观看 | 欧美最猛性xxxxx亚洲精品 | 欧美日本一二三 | 亚洲免费在线 | 五月婷婷开心中文字幕 | www.看片网站 | 国产馆在线播放 | 日韩精品免费专区 | 在线超碰av | 中文字幕精品一区二区精品 | 在线一区av| 色网站免费在线观看 | 尤物一区二区三区 | 国产成人免费观看 | 久久国产精品免费 | 国产资源网站 | 激情欧美一区二区三区免费看 | 韩国av一区二区三区 | 蜜臀av性久久久久av蜜臀妖精 | 久久激情五月激情 | 国产成人在线免费观看 | 成人av资源网站 | 亚洲国产片 | 国产黄影院色大全免费 | a午夜在线 | 国产一区在线免费观看 | 午夜av免费观看 | 2024国产精品视频 | 日韩综合一区二区三区 | 国产精品观看视频 | 99久久精品国产亚洲 | 娇妻呻吟一区二区三区 | 久草在线视频在线观看 | 99视频精品免费视频 | 精品亚洲欧美无人区乱码 | 激情综合中文娱乐网 | 色综合久久88色综合天天6 | 国产精品涩涩屋www在线观看 | 精品久久免费 | 人人干狠狠干 | 黄免费网站| 成人国产精品电影 | 又爽又黄在线观看 | 国产精品久久久久久久久久ktv | 国产精品精 | 日本婷婷色| 免费国产一区二区 | 91一区二区在线 | 日韩久久精品一区二区 | 麻豆观看 | 91精品啪啪 | 在线韩国电影免费观影完整版 | 亚洲黄色在线免费观看 | 婷婷av资源| 激情久久五月 | 久久成人免费视频 | 亚洲免费视频在线观看 | 91视频xxxx| 伊人资源站 | 91网站免费观看 | 免费在线看v | 五月天.com | 韩国av免费观看 | 久久不射电影院 | 欧美一区二区三区在线视频观看 | 免费视频97 | 99九九视频 | 在线观看日韩中文字幕 | 国产视频2 | 国产成人精品综合久久久久99 | 日本中文字幕在线视频 | 国产精品美女www爽爽爽视频 | 国产99久久久国产精品 | 97在线观看免费视频 | 五月天综合网 | 久久国产一区 | 亚洲天堂香蕉 | 午夜黄色大片 | 中文字幕亚洲欧美日韩 | 色在线免费| 99综合电影在线视频 | 日本久久综合视频 | 999免费视频 | 99热只有精品在线观看 | 日本天天色 | 中文字幕 国产视频 | 久久久久久久av麻豆果冻 | 91在线免费观看国产 | 欧美日韩午夜爽爽 | 精品国产一区二区三区久久久蜜月 | 日韩在线免费视频观看 | 黄色一二级片 | 国产精品理论在线观看 | 97色免费视频 | 国产成视频在线观看 | 黄色a一级片 | 国产亚洲在线 | 视频一区在线免费观看 | 开心综合网 | 久久久久久久看片 |