成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > ASP.NET MVC5網(wǎng)站開發(fā)之用戶添加和瀏覽2(七)

ASP.NET MVC5網(wǎng)站開發(fā)之用戶添加和瀏覽2(七)

熱門標(biāo)簽:電銷專用外呼線路 地圖標(biāo)注位置怎么弄圖 400電話唐山辦理 漯河外呼調(diào)研線路 電話機(jī)器人鑰匙扣 廣西房產(chǎn)智能外呼系統(tǒng)推薦 旅游地圖標(biāo)注線路 電銷外呼系統(tǒng)是違法的嗎 威力最大的電銷機(jī)器人

一、數(shù)據(jù)存儲(chǔ)層

1、查找分頁列表

在寫用戶列表時(shí)遇到了問題,考慮到用戶可能會(huì)較多的情況需要分頁,在數(shù)據(jù)存儲(chǔ)層寫的方法是public IQueryableT> FindPageListTKey>(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, bool>> where, ExpressionFuncT, TKey>> order, bool asc)。

主要問題就在紅色的order這兒,這個(gè)參數(shù)不好傳遞,比如:如果是已ID來排序哪TKey類型是int,如果以注冊(cè)時(shí)間來排序哪TKey類型就是datetime。如果我在業(yè)務(wù)邏輯層寫一個(gè)函數(shù)可以支持選擇排序類型,那么我沒有辦法聲明一個(gè)變量既可以存儲(chǔ)TKey為int的值,又可以存儲(chǔ)datetime的值,那么排序就要寫成下面這個(gè)樣子,感覺不舒服。

//排序
      switch(order)
      {
        case 0://ID升序
          _users.Items = Repository.FindPageList((int)pageSize, (int)pageIndex, out _users.TotalNumber, _where, u => u.UserID, true).ToList();
          break;
        case 1://ID降序
          _users.Items = Repository.FindPageList((int)pageSize, (int)pageIndex, out _users.TotalNumber, _where, u => u.UserID, false).ToList();
          break;
        case 2://注冊(cè)時(shí)間降序
          _users.Items = Repository.FindPageList((int)pageSize, (int)pageIndex, out _users.TotalNumber, _where, u => u.RegTime, true).ToList();
          break;
        case 3://注冊(cè)時(shí)間升序
          _users.Items = Repository.FindPageList((int)pageSize, (int)pageIndex, out _users.TotalNumber, _where, u => u.RegTime, false).ToList();
          break;
        case 4://最后登錄時(shí)間升序
          _users.Items = Repository.FindPageList((int)pageSize, (int)pageIndex, out _users.TotalNumber, _where, u => u.LastLoginTime, true).ToList();
          break;
        case 5://最后登錄時(shí)間降序
          _users.Items = Repository.FindPageList((int)pageSize, (int)pageIndex, out _users.TotalNumber, _where, u => u.LastLoginTime, false).ToList();
          break;
        default://ID降序
          _users.Items = Repository.FindPageList((int)pageSize, (int)pageIndex, out _users.TotalNumber, _where, u => u.UserID, false).ToList();
          break;
      }

后來將TKey設(shè)為dynamic類型,不論ExpressionFuncT, dynamic>> order = u => u.UserID  或者u => u.RegTime都可以編譯通過,但是一運(yùn)行就會(huì)出錯(cuò)。

前幾天沒寫博客一直在考慮這個(gè)問題,后來還是換成用字符串的方式來動(dòng)態(tài)排序。 步驟如下:

Ninesky.DataLibrary[右鍵]->添加->類,輸入類名OrderParam

namespace Ninesky.DataLibrary
{
  /// summary>
  /// 排序參數(shù)
  /// /summary>
  public class OrderParam
  {
    /// summary>
    /// 屬性名
    /// /summary>
    public string PropertyName { get; set; }

    /// summary>
    /// 排序方式
    /// /summary>
    public OrderMethod Method { get; set; }
  }

  /// summary>
  /// 排序方式
  /// /summary>
  public enum OrderMethod
  {
    /// summary>
    /// 正序
    /// /summary>
    ASC,
    /// summary>
    /// 倒序
    /// /summary>
    DESC
  }
}

打開Ninesky.DataLibrary/Repository.cs,將方法public IQueryableT> FindPageListTKey>(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, bool>> where, ExpressionFuncT, TKey>> order, bool asc)的代碼修改為

/// summary>
    /// 查找分頁列表
    /// /summary>
    /// param name="pageSize">每頁記錄數(shù)。必須大于1/param>
    /// param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1/param>
    /// param name="totalNumber">總記錄數(shù)/param>
    /// param name="where">查詢表達(dá)式/param>
    /// param name="orderParams">排序【null-不設(shè)置】/param>
    public IQueryableT> FindPageList(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, bool>> where, OrderParam[] orderParams)
    {
      if (pageIndex  1) pageIndex = 1;
      if (pageSize  1) pageSize = 10;
      IQueryableT> _list = DbContext.SetT>().Where(where);
      var _orderParames = Expression.Parameter(typeof(T), "o");
      if (orderParams != null  orderParams.Length > 0)
      {
        for (int i = 0; i  orderParams.Length; i++)
        {
          //根據(jù)屬性名獲取屬性
          var _property = typeof(T).GetProperty(orderParams[i].PropertyName);
          //創(chuàng)建一個(gè)訪問屬性的表達(dá)式
          var _propertyAccess = Expression.MakeMemberAccess(_orderParames, _property);
          var _orderByExp = Expression.Lambda(_propertyAccess, _orderParames);
          string _orderName = orderParams[i].Method == OrderMethod.ASC ? "OrderBy" : "OrderByDescending";
          MethodCallExpression resultExp = Expression.Call(typeof(Queryable), _orderName, new Type[] { typeof(T), _property.PropertyType }, _list.Expression, Expression.Quote(_orderByExp));
          _list = _list.Provider.CreateQueryT>(resultExp);
        }
      }
      totalNumber = _list.Count();
      return _list.Skip((pageIndex - 1) * pageIndex).Take(pageSize);
    }

方法中排序參數(shù)(OrderParam[]) 使用數(shù)組,是考慮到多級(jí)排序的情況。對(duì)FindPageList重載代碼進(jìn)行修改,修改完的代碼如下:

//查找實(shí)體分頁列表
    #region FindPageList

    /// summary>
    /// 查找分頁列表
    /// /summary>
    /// param name="pageSize">每頁記錄數(shù)。必須大于1/param>
    /// param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1/param>
    /// param name="totalNumber">總記錄數(shù)/param>
    /// returns>/returns>
    public IQueryableT> FindPageList(int pageSize, int pageIndex, out int totalNumber)
    {
      OrderParam _orderParam = null;
      return FindPageList(pageSize, pageIndex, out totalNumber, _orderParam);
    }

    /// summary>
    /// 查找分頁列表
    /// /summary>
    /// param name="pageSize">每頁記錄數(shù)。必須大于1/param>
    /// param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1/param>
    /// param name="totalNumber">總記錄數(shù)/param>
    /// param name="order">排序鍵/param>
    /// param name="asc">是否正序/param>
    /// returns>/returns>
    public IQueryableT> FindPageList(int pageSize, int pageIndex, out int totalNumber, OrderParam orderParam)
    {
      return FindPageList(pageSize, pageIndex, out totalNumber, (T)=> true, orderParam);
    }

    /// summary>
    /// 查找分頁列表
    /// /summary>
    /// param name="pageSize">每頁記錄數(shù)。必須大于1/param>
    /// param name="pageIndex">頁碼。首頁從1開始,頁碼必須大于1/param>
    /// param name="totalNumber">總記錄數(shù)/param>
    /// param name="where">查詢表達(dá)式/param>
    public IQueryableT> FindPageList(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, bool>> where)
    {
      OrderParam _param = null;
      return FindPageList(pageSize, pageIndex, out totalNumber, where, _param);
    }

    /// summary>
    /// 查找分頁列表
    /// /summary>
    /// param name="pageSize">每頁記錄數(shù)。/param>
    /// param name="pageIndex">頁碼。首頁從1開始/param>
    /// param name="totalNumber">總記錄數(shù)/param>
    /// param name="where">查詢表達(dá)式/param>
    /// param name="orderParam">排序【null-不設(shè)置】/param>
    /// returns>/returns>
    public IQueryableT> FindPageList(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, bool>> where, OrderParam orderParam)
    {
      OrderParam[] _orderParams = null;
      if (orderParam != null) _orderParams = new OrderParam[] { orderParam };
      return FindPageList(pageSize, pageIndex, out totalNumber, where, _orderParams);
    }

    /// summary>
    /// 查找分頁列表
    /// /summary>
    /// param name="pageSize">每頁記錄數(shù)。/param>
    /// param name="pageIndex">頁碼。首頁從1開始/param>
    /// param name="totalNumber">總記錄數(shù)/param>
    /// param name="where">查詢表達(dá)式/param>
    /// param name="orderParams">排序【null-不設(shè)置】/param>
    public IQueryableT> FindPageList(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, bool>> where, OrderParam[] orderParams)
    {
      if (pageIndex  1) pageIndex = 1;
      if (pageSize  1) pageSize = 10;
      IQueryableT> _list = DbContext.SetT>().Where(where);
      var _orderParames = Expression.Parameter(typeof(T), "o");
      if (orderParams != null  orderParams.Length > 0)
      {
        for (int i = 0; i  orderParams.Length; i++)
        {
          //根據(jù)屬性名獲取屬性
          var _property = typeof(T).GetProperty(orderParams[i].PropertyName);
          //創(chuàng)建一個(gè)訪問屬性的表達(dá)式
          var _propertyAccess = Expression.MakeMemberAccess(_orderParames, _property);
          var _orderByExp = Expression.Lambda(_propertyAccess, _orderParames);
          string _orderName = orderParams[i].Method == OrderMethod.ASC ? "OrderBy" : "OrderByDescending";
          MethodCallExpression resultExp = Expression.Call(typeof(Queryable), _orderName, new Type[] { typeof(T), _property.PropertyType }, _list.Expression, Expression.Quote(_orderByExp));
          _list = _list.Provider.CreateQueryT>(resultExp);
        }
      }
      totalNumber = _list.Count();
      return _list.Skip((pageIndex - 1) * pageIndex).Take(pageSize);
    }

    #endregion

2、查找列表

基于分頁列表同樣的原因,對(duì)FindList方法也進(jìn)行修改。

//查找實(shí)體列表
    #region FindList
    /// summary>
    /// 查找實(shí)體列表
    /// /summary>
    /// returns>/returns>
    public IQueryableT> FindList()
    {
      return DbContext.SetT>();
    }

    /// summary>
    /// 查找實(shí)體列表
    /// /summary>
    /// param name="where">查詢Lambda表達(dá)式/param>
    /// returns>/returns>
    public IQueryableT> FindList(ExpressionFuncT, bool>> where)
    {
      return DbContext.SetT>().Where(where);
    }

    /// summary>
    /// 查找實(shí)體列表
    /// /summary>
    /// param name="where">查詢Lambda表達(dá)式/param>
    /// param name="number">獲取的記錄數(shù)量/param>
    /// returns>/returns>
    public IQueryableT> FindList(ExpressionFuncT, bool>> where, int number)
    {
      return DbContext.SetT>().Where(where).Take(number);
    }

    /// summary>
    /// 查找實(shí)體列表
    /// /summary>
    /// param name="where">查詢Lambda表達(dá)式/param>
    /// param name="orderParam">排序參數(shù)/param>
    /// returns>/returns>
    public IQueryableT> FindList(ExpressionFuncT, bool>> where, OrderParam orderParam)
    {
      return FindList(where, orderParam, 0);
    }

    /// summary>
    /// 查找實(shí)體列表
    /// /summary>
    /// param name="where">查詢Lambda表達(dá)式/param>
    /// param name="orderParam">排序參數(shù)/param>
    /// param name="number">獲取的記錄數(shù)量【0-不啟用】/param>
    public IQueryableT> FindList(ExpressionFuncT, bool>> where, OrderParam orderParam, int number)
    {
      OrderParam[] _orderParams = null;
      if (orderParam != null) _orderParams = new OrderParam[] { orderParam };
      return FindList(where, _orderParams, number);
    }

    /// summary>
    /// 查找實(shí)體列表
    /// /summary>
    /// param name="where">查詢Lambda表達(dá)式/param>
    /// param name="orderParams">排序參數(shù)/param>
    /// param name="number">獲取的記錄數(shù)量【0-不啟用】/param>
    /// returns>/returns>
    public IQueryableT> FindList(ExpressionFuncT, bool>> where, OrderParam[] orderParams, int number)
    {
      var _list = DbContext.SetT>().Where(where);
      var _orderParames = Expression.Parameter(typeof(T), "o");
      if (orderParams != null  orderParams.Length > 0)
      {
        for (int i = 0; i  orderParams.Length; i++)
        {
          //根據(jù)屬性名獲取屬性
          var _property = typeof(T).GetProperty(orderParams[i].PropertyName);
          //創(chuàng)建一個(gè)訪問屬性的表達(dá)式
          var _propertyAccess = Expression.MakeMemberAccess(_orderParames, _property);
          var _orderByExp = Expression.Lambda(_propertyAccess, _orderParames);
          string _orderName = orderParams[i].Method == OrderMethod.ASC ? "OrderBy" : "OrderByDescending";
          MethodCallExpression resultExp = Expression.Call(typeof(Queryable), _orderName, new Type[] { typeof(T), _property.PropertyType }, _list.Expression, Expression.Quote(_orderByExp));
          _list = _list.Provider.CreateQueryT>(resultExp);
        }
      }
      if (number > 0) _list = _list.Take(number);
      return _list;
    }
    #endregion

二、業(yè)務(wù)邏輯層

1、用戶模型

Ninesky.Core【右鍵】->添加->類,輸入類名User。

引用System.ComponentModel.DataAnnotations命名空間

using System;
using System.ComponentModel.DataAnnotations;

namespace Ninesky.Core
{
  /// summary>
  /// 用戶模型
  /// /summary>
  public class User
  {
    [Key]
    public int UserID { get; set; }

    /// summary>
    /// 角色I(xiàn)D
    /// /summary>
    [Required(ErrorMessage = "必須輸入{0}")]
    [Display(Name = "角色I(xiàn)D")]
    public int RoleID { get; set; }

    /// summary>
    /// 用戶名
    /// /summary>
    [StringLength(50, MinimumLength = 4, ErrorMessage = "{0}長度為{2}-{1}個(gè)字符")]
    [Display(Name = "用戶名")]
    public string Username { get; set; }

    /// summary>
    /// 名稱【可做昵稱、真實(shí)姓名等】
    /// /summary>
    [StringLength(20, ErrorMessage = "{0}必須少于{1}個(gè)字符")]
    [Display(Name = "名稱")]
    public string Name { get; set; }

    /// summary>
    /// 性別【0-女,1-男,2-保密】
    /// /summary>
    [Required(ErrorMessage = "必須輸入{0}")]
    [Range(0,2,ErrorMessage ="{0}范圍{1}-{2}")]
    [Display(Name = "性別")]
    public int Sex { get; set; }

    /// summary>
    /// 密碼
    /// /summary>
    [DataType(DataType.Password)]
    [StringLength(256, ErrorMessage = "{0}長度少于{1}個(gè)字符")]
    [Display(Name = "密碼")]
    public string Password { get; set; }

    /// summary>
    /// Email
    /// /summary>
    [DataType(DataType.EmailAddress)]
    [StringLength(50, MinimumLength = 4, ErrorMessage = "{0}長度為{2}-{1}個(gè)字符")]
    [Display(Name = "Email")]
    public string Email { get; set; }

    /// summary>
    /// 最后登錄時(shí)間
    /// /summary>
    [DataType(DataType.DateTime)]
    [Display(Name = "最后登錄時(shí)間")]
    public NullableDateTime> LastLoginTime { get; set; }


    /// summary>
    /// 最后登錄IP
    /// /summary>
    [Display(Name = "最后登錄IP")]
    public string LastLoginIP { get; set; }

    /// summary>
    /// 注冊(cè)時(shí)間
    /// /summary>
    [Required(ErrorMessage = "必須輸入{0}")]
    [Display(Name = "注冊(cè)時(shí)間")]
    public DateTime RegTime { get; set; }

    /// summary>
    /// 角色
    /// /summary>
    public virtual Role Role { get; set; }

  }
}

用戶名、密碼和Email未設(shè)置成必填是考慮到,以后可以擴(kuò)展QQ賬號(hào)、微博賬號(hào)等Owin方式登錄等功能,用Owin登錄的賬號(hào)不會(huì)有這幾個(gè)參數(shù)。對(duì)于用戶添加和注冊(cè),可以寫一個(gè)視圖模型進(jìn)行驗(yàn)證。

2、添加表映射

打開Ninesky.Core/NineskyContext.cs,添加Users表映射(紅框部分)

3、更新數(shù)據(jù)表

在【工具欄】->【工具】->NuGet包管理器->程序包管理器控制臺(tái),運(yùn)行命令Update-Database。

4、用戶管理類

Ninesky.Core【右鍵】->添加->類,輸入類名UserManager,類繼承自BaseManagerUser>

引用命名空間:using Ninesky.Core.Types; using Ninesky.DataLibrary;

因一般網(wǎng)站用戶的數(shù)量肯能要較多,在顯示用戶列表的時(shí)候要分頁顯示,在數(shù)據(jù)存儲(chǔ)層(Ninesky.DataLibrary)的Repository類中 public IQueryableT> FindPageListTKey>(int pageSize, int pageIndex, out int totalNumber, ExpressionFuncT, bool>> where, ExpressionFuncT, TKey>> order, bool asc)等分頁方法,方法參數(shù)where為Lambda表達(dá)式樹,在UserManager類的方法中我希望動(dòng)態(tài)構(gòu)造表達(dá)式樹,這里需要借助一個(gè)小工具LINQKit。

Ninesky.Core->引用【右鍵】->管理NuGet程序包。

在NuGet包管理器中搜索linqkit,安裝LinqKit最新版本。

在UserController中引用命名空間using LinqKit;

4.1 分頁列表

添加FindPageList方法,代碼如下:

/// summary>
    /// 分頁列表
    /// /summary>
    /// param name="pagingUser">分頁數(shù)據(jù)/param>
    /// param name="roleID">角色I(xiàn)D/param>
    /// param name="username">用戶名/param>
    /// param name="name">名稱/param>
    /// param name="sex">性別/param>
    /// param name="email">Email/param>
    /// param name="order">排序【null(默認(rèn))-ID降序,0-ID升序,1-ID降序,2-注冊(cè)時(shí)間降序,3-注冊(cè)時(shí)間升序,4-最后登錄時(shí)間升序,5-最后登錄時(shí)間降序】/param>
    /// returns>/returns>
    public PagingUser> FindPageList(PagingUser> pagingUser, int? roleID, string username, string name, int? sex, string email, int? order)
    {
      //查詢表達(dá)式
      var _where = PredicateBuilder.TrueUser>();
      if (roleID != null  roleID > 0) _where = _where.And(u => u.RoleID == roleID);
      if (!string.IsNullOrEmpty(username)) _where = _where.And(u => u.Username.Contains(username));
      if (!string.IsNullOrEmpty(name)) _where = _where.And(u => u.Name.Contains(name));
      if (sex != null  sex >= 0  sex = 2) _where = _where.And(u => u.Sex == sex);
      if (!string.IsNullOrEmpty(email)) _where = _where.And(u => u.Email.Contains(email));
      //排序
      OrderParam _orderParam;
      switch(order)
      {
        case 0://ID升序
          _orderParam = new OrderParam() { PropertyName = "UserID", Method = OrderMethod.ASC };
          break;
        case 1://ID降序
          _orderParam = new OrderParam() { PropertyName = "UserID", Method = OrderMethod.DESC };
          break;
        case 2://注冊(cè)時(shí)間降序
          _orderParam = new OrderParam() { PropertyName = "RegTime", Method = OrderMethod.ASC };
          break;
        case 3://注冊(cè)時(shí)間升序
          _orderParam = new OrderParam() { PropertyName = "RegTime", Method = OrderMethod.DESC };
          break;
        case 4://最后登錄時(shí)間升序
          _orderParam = new OrderParam() { PropertyName = "LastLoginTime", Method = OrderMethod.ASC };
          break;
        case 5://最后登錄時(shí)間降序
          _orderParam = new OrderParam() { PropertyName = "LastLoginTime", Method = OrderMethod.DESC };
          break;
        default://ID降序
          _orderParam = new OrderParam() { PropertyName = "UserID", Method = OrderMethod.DESC };
          break;
      }
      pagingUser.Items = Repository.FindPageList(pagingUser.PageSize,pagingUser.PageIndex, out pagingUser.TotalNumber, _where.Expand(),_orderParam).ToList();
      return pagingUser;
    }

4.2 判斷用戶名是否存在

添加HasUsername方法,代碼如下

/// summary>
    /// 用戶名是否存在
    /// /summary>
    /// param name="accounts">用戶名[不區(qū)分大小寫]/param>
    /// returns>/returns>
    public bool HasUsername(string username)
    {
      return base.Repository.IsContains(u => u.Username.ToUpper() == username.ToUpper());
    }

4.3判斷Email是否存在

添加HasEmail方法,代碼如下

/// summary>
    /// Email是否存在
    /// /summary>
    /// param name="email">Email[不區(qū)分大小寫]/param>
    /// returns>/returns>
    public bool HasEmail(string email)
    {
      return base.Repository.IsContains(u => u.Email.ToUpper() == email.ToUpper());
    }

4.4 添加用戶

因添加用戶時(shí),賬號(hào)和Email不能重復(fù)所以添加前先判斷一下用戶名和密碼是否存在。這里用戶名為空時(shí)不進(jìn)行判斷是因?yàn)榭紤]有可能以后使用可能用QQ等其他方式登錄。

/// summary>
    /// 添加【返回值Response.Code:0-失敗,1-成功,2-賬號(hào)已存在,3-Email已存在】
    /// /summary>
    /// param name="user">用戶/param>
    /// returns>/returns>
    public override Response Add(User user)
    {
      Response _resp = new Response();
      //賬號(hào)是否存在
      if (!string.IsNullOrEmpty(user.Username)  HasUsername(user.Username))
      {
        _resp.Code = 2;
        _resp.Message = "用戶名已存在";
      }
      //Email是否存在
      if (!string.IsNullOrEmpty(user.Email)  HasUsername(user.Email))
      {
        _resp.Code = 3;
        _resp.Message = "Email已存在";
      }
      if(_resp.Code == 0) _resp = base.Add(user);
      return _resp;
    }

三、展示層

Ninesky.Web/Areas/Control/Controllers【右鍵】->添加->控制器。選擇 MVC5 控制器 – 空, 輸入控制器名稱UserController。

在控制器中引入命名空間Ninesky.Core;(1)

為控制器添加身份驗(yàn)證[AdminAuthorize](2)

添加變量private RoleManager roleManager = new RoleManager();(3)

1、用戶瀏覽

1.1、分頁列表方法

在UserController中添加方法PageListJson,返回Json格式的分頁數(shù)據(jù)。

/// summary>
    /// 分頁列表【json】
    /// /summary>
    /// param name="roleID">角色I(xiàn)D/param>
    /// param name="username">用戶名/param>
    /// param name="name">名稱/param>
    /// param name="sex">性別/param>
    /// param name="email">Email/param>
    /// param name="pageIndex">頁碼/param>
    /// param name="pageSize">每頁記錄數(shù)/param>
    /// param name="order">排序/param>
    /// returns>Json/returns>
    public ActionResult PageListJson(int? roleID, string username,string name,int? sex,string email,int? pageNumber, int? pageSize,int? order)
    {
      PagingUser> _pagingUser = new PagingCore.User>();
      if (pageNumber != null  pageNumber > 0) _pagingUser.PageIndex = (int)pageNumber;
      if (pageSize != null  pageSize > 0) _pagingUser.PageSize = (int)pageSize;
      var _paging = userManager.FindPageList(_pagingUser, roleID, username, name, sex, email, null);
      return Json(new { total = _paging.TotalNumber, rows = _paging.Items });
    }

1.2、默認(rèn)頁視圖

在UserController中添加Index方法

/// summary>
    /// 默認(rèn)頁
    /// /summary>
    /// returns>/returns>
    public ActionResult Index()
    {
      return View();
    }

在Index 方法上點(diǎn)右鍵 –>添加->視圖

@{
  ViewBag.Title = "用戶管理";
}

@section SideNav{@Html.Partial("SideNavPartialView")}

ol class="breadcrumb">
  li>span class="glyphicon glyphicon-home">/span> @Html.ActionLink("首頁", "Index", "Home")/li>
  li class="active">@Html.ActionLink("用戶管理", "Index", "User")/li>
/ol>

table id="usergrid">/table>
@section style{
  @Styles.Render("~/Content/bootstrapplugincss")
}

@section scripts{
  @Scripts.Render("~/bundles/jqueryval")
  @Scripts.Render("~/bundles/bootstrapplugin")
  script type="text/javascript">
    $(document).ready(function () {
      //表格
      var $table = $('#usergrid');
      $table.bootstrapTable({
        showRefresh: true,
        showColumns: true,
        pagination: true,
        sidePagination: "server",
        pageList:"[5, 10, 20, 50, 100]",
        method: "post",
        url: "@Url.Action("PageListJson")",
        columns: [
          { title: "ID", field: "UserID" },
          { title: "角色", field: "RoleID" },
          { title: "用戶名", field: "Username" },
          { title: "名稱", field: "Name", formatter: function (value, row, index) { return "a href='@Url.Action("Modify", "User")/" + row.UserID + "'>" + value + "/a>" } },
          { title: "性別", field: "Sex" },
          { title: "Email", field: "Email", visible:false },
          { title: "最后登錄時(shí)間", field: "LastLoginTime" },
          { title: "最后登錄IP", field: "LastLoginIP", visible:false },
          { title: "注冊(cè)時(shí)間", field: "RegTime",visible:false },
          { title: "操作", field: "UserID", formatter: function (value) { return "a class='btn btn-sm btn-danger' data-operation='deleteuser' data-value='" + value + "'>刪除/a>" } }
        ],
        onLoadSuccess: function () {
          //刪除按鈕
          //刪除按鈕結(jié)束
        }
      });
      //表格結(jié)束
    });
  /script>
}

1.3側(cè)導(dǎo)航局部視圖

Ninesky.Web/Areas/Control/Views/User【右鍵】->添加->視圖,輸入視圖名稱

div class="panel panel-default">
  div class="panel-heading">
    div class="panel-title">span class="glyphicon glyphicon-user">/span> 用戶管理/div>
  /div>
  div class="panel-body">
    div class="list-group">
      div class="list-group-item">span class="glyphicon glyphicon-plus">/span> @Html.ActionLink("添加用戶", "Add", "User")/div>
      div class="list-group-item">span class="glyphicon glyphicon-list">/span> @Html.ActionLink("用戶管理", "Index", "User")/div>
    /div>
  /div>
/div>

2、添加用戶

2.1 添加用戶視圖模型

Ninesky.Web/Areas/Control/Models【右鍵】->添加->“AddUserViewModel”

using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace Ninesky.Web.Areas.Control.Models
{
  /// summary>
  /// 添加用戶視圖模型類
  /// /summary>
  public class AddUserViewModel
  {
    /// summary>
    /// 角色I(xiàn)D
    /// /summary>
    [Required(ErrorMessage = "必須選擇{0}")]
    [Display(Name = "角色I(xiàn)D")]
    public int RoleID { get; set; }

    /// summary>
    /// 用戶名
    /// /summary>
    [Remote("CanUsername","User",HttpMethod = "Post", ErrorMessage ="用戶名已存在")]
    [StringLength(50, MinimumLength = 4, ErrorMessage = "{0}長度為{2}-{1}個(gè)字符")]
    [Required(ErrorMessage = "必須輸入{0}")]
    [Display(Name = "用戶名")]
    public string Username { get; set; }

    /// summary>
    /// 姓名【可做昵稱、真實(shí)姓名等】
    /// /summary>
    [StringLength(20, ErrorMessage = "{0}必須少于{1}個(gè)字符")]
    [Display(Name = "姓名")]
    public string Name { get; set; }

    /// summary>
    /// 性別【0-女,1-男,2-保密】
    /// /summary>
    [Required(ErrorMessage = "必須選擇{0}")]
    [Range(0, 2, ErrorMessage = "{0}范圍{1}-{2}")]
    [Display(Name = "性別")]
    public int Sex { get; set; }

    /// summary>
    /// 密碼
    /// /summary>
    [Required(ErrorMessage = "必須輸入{0}")]
    [DataType(DataType.Password)]
    [StringLength(256, ErrorMessage = "{0}長度少于{1}個(gè)字符")]
    [Display(Name = "密碼")]
    public string Password { get; set; }

    /// summary>
    /// 確認(rèn)密碼
    /// /summary>
    [System.ComponentModel.DataAnnotations.Compare("Password",ErrorMessage ="兩次輸入的密碼不一致")]
    [DataType(DataType.Password)]
    [Display(Name = "確認(rèn)密碼")]
    public string ConfirmPassword { get; set; }

    /// summary>
    /// Email
    /// /summary>
    [Required(ErrorMessage = "必須輸入{0}")]
    [DataType(DataType.EmailAddress)]
    [Remote("CanEmail", "User",HttpMethod = "Post", ErrorMessage = "Email已存在")]
    [StringLength(50, MinimumLength = 4, ErrorMessage = "{0}長度為{2}-{1}個(gè)字符")]
    [Display(Name = "Email")]
    public string Email { get; set; }
  }
}

模型中使用到了遠(yuǎn)程驗(yàn)證(Remote)、屬性比較(Compare)等驗(yàn)證方式。

2.2用戶名和Email遠(yuǎn)程驗(yàn)證方法

在UserController中添加CanUsername和CanEmail方法

/// summary>
    /// 用戶名是否可用
    /// /summary>
    /// param name="UserName">用戶名/param>
    /// returns>/returns> 
    [HttpPost]
    public JsonResult CanUsername(string UserName)
    {
      return Json(!userManager.HasUsername(UserName));
    }

    /// summary>
    /// Email是否存可用
    /// /summary>
    /// param name="Email">Email/param>
    /// returns>/returns> 
    [HttpPost]
    public JsonResult CanEmail(string Email)
    {
      return Json(!userManager.HasEmail(Email));
    }

2.3 添加用戶頁面

在UserController中添加Add方法

/// summary>
    /// 添加用戶
    /// /summary>
    /// returns>/returns>
    public ActionResult Add()
    {
      //角色列表
      var _roles = new RoleManager().FindList();
      ListSelectListItem> _listItems = new ListSelectListItem>(_roles.Count());
      foreach(var _role in _roles)
      {
        _listItems.Add(new SelectListItem() { Text = _role.Name, Value = _role.RoleID.ToString() });
      }
      ViewBag.Roles = _listItems;
      //角色列表結(jié)束
      return View();
    }

方法中向視圖傳遞角色列表ViewBag.Roles

右鍵添加視圖

代碼如下:

@model Ninesky.Web.Areas.Control.Models.AddUserViewModel

@{
  ViewBag.Title = "添加用戶";
}

@section SideNav{@Html.Partial("SideNavPartialView")}

ol class="breadcrumb">
  li>span class="glyphicon glyphicon-home">/span> @Html.ActionLink("首頁", "Index", "Home")/li>
  li> @Html.ActionLink("用戶管理", "Index", "User")/li>
  li class="active">@Html.ActionLink("添加用戶", "Add", "User")/li>
/ol>
@using (Html.BeginForm()) 
{
  @Html.AntiForgeryToken()
  
  div class="form-horizontal">
    hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    div class="form-group">
      @Html.LabelFor(model => model.RoleID, htmlAttributes: new { @class = "control-label col-md-2" })
      div class="col-md-10">
        @Html.DropDownListFor(model => model.RoleID, (IEnumerableSelectListItem>)ViewBag.Roles, new { @class = "form-control" });
        @Html.ValidationMessageFor(model => model.RoleID, "", new { @class = "text-danger" })
      /div>
    /div>

    div class="form-group">
      @Html.LabelFor(model => model.Username, htmlAttributes: new { @class = "control-label col-md-2" })
      div class="col-md-10">
        @Html.EditorFor(model => model.Username, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })
      /div>
    /div>

    div class="form-group">
      @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
      div class="col-md-10">
        @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
      /div>
    /div>

    div class="form-group">
      @Html.LabelFor(model => model.Sex, htmlAttributes: new { @class = "control-label col-md-2" })
      div class="col-md-10">
        @Html.RadioButtonFor(model => model.Sex, 1) 男
        @Html.RadioButtonFor(model => model.Sex, 0) 女
        @Html.RadioButtonFor(model => model.Sex, 2) 保密
        
        @Html.ValidationMessageFor(model => model.Sex, "", new { @class = "text-danger" })
      /div>
    /div>

    div class="form-group">
      @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
      div class="col-md-10">
        @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
      /div>
    /div>
    div class="form-group">
      @Html.LabelFor(model => model.ConfirmPassword, htmlAttributes: new { @class = "control-label col-md-2" })
      div class="col-md-10">
        @Html.EditorFor(model => model.ConfirmPassword, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.ConfirmPassword, "", new { @class = "text-danger" })
      /div>
    /div>

    div class="form-group">
      @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
      div class="col-md-10">
        @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
      /div>
    /div>

    div class="form-group">
      div class="col-md-offset-2 col-md-10">
        input type="submit" value="添加" class="btn btn-default" />
      /div>
    /div>
  /div>
}
@Scripts.Render("~/bundles/jqueryval")

2.4添加處理方法

UserController中添加Add(AddUserViewModel userViewModel)方法

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Add(AddUserViewModel userViewModel)
    {
      if (userManager.HasUsername(userViewModel.Username)) ModelState.AddModelError("Username","用戶名已存在");
      if (userManager.HasEmail(userViewModel.Email)) ModelState.AddModelError("Email", "Email已存在");
      if (ModelState.IsValid)
      {
        Core.User _user = new Core.User();
        _user.RoleID = userViewModel.RoleID;
        _user.Username = userViewModel.Username;
        _user.Name = userViewModel.Name;
        _user.Sex = userViewModel.Sex;
        _user.Password = Core.General.Security.SHA256(userViewModel.Password);
        _user.Email = userViewModel.Email;
        _user.RegTime = System.DateTime.Now;
        var _response = userManager.Add(_user);
        if (_response.Code == 1) return View("Prompt",new Prompt() { Title="添加用戶成功",
         Message="您已成功添加了用戶【"+ _response.Data.Username+ "("+ _response.Data.Name + ")】",
         Buttons= new Liststring> {"a href=\"" + Url.Action("Index", "User") + "\" class=\"btn btn-default\">用戶管理/a>",
         "a href=\"" + Url.Action("Details", "User",new { id= _response.Data.UserID }) + "\" class=\"btn btn-default\">查看用戶/a>",
         "a href=\"" + Url.Action("Add", "User") + "\" class=\"btn btn-default\">繼續(xù)添加/a>"} });
        else ModelState.AddModelError("", _response.Message);
      }
      //角色列表
      var _roles = new RoleManager().FindList();
      ListSelectListItem> _listItems = new ListSelectListItem>(_roles.Count());
      foreach (var _role in _roles)
      {
        _listItems.Add(new SelectListItem() { Text = _role.Name, Value = _role.RoleID.ToString() });
      }
      ViewBag.Roles = _listItems;
      //角色列表結(jié)束

      return View(userViewModel);
    } 

2.5添加成功提示

UserController中[右鍵]添加視圖-Prompt

@model Ninesky.Web.Models.Prompt

@{
  ViewBag.Title = "提示";
}

@section SideNav{@Html.Partial("SideNavPartialView")}

ol class="breadcrumb">
  li>span class="glyphicon glyphicon-home">/span> @Html.ActionLink("首頁", "Index", "Home")/li>
  li class="active"> @Html.ActionLink("用戶管理", "Index", "User")/li>
/ol>
@Html.Partial("PromptPartialView", Model)

2.6 添加提示消息局部視圖

Ninesky.Web/Areas/Control/Views/Shared【右鍵】->添加->視圖。視圖名為PromptPartialView。

代碼如下:

@model Ninesky.Web.Models.Prompt

div class="panel panel-default">
  div class="panel-heading">div class="panel-title">@Model.Title/div>/div>
  div class="panel-body">
    p>@Html.Raw(Model.Message)/p>
    @if (Model.Buttons != null  Model.Buttons.Count > 0)
    {
      p>
        @foreach (var item in Model.Buttons)
        {
          @Html.Raw(item + "nbsp;nbsp;")

        }
      /p>
    }
  /div>
/div>

 運(yùn)行效果

===============================================================

前幾天就忙完了,中間休息了一下,順便調(diào)整一下狀態(tài)。

由于代碼20多天前些了一部分,到現(xiàn)在有些忘記當(dāng)時(shí)的想法了,今天又寫了一些感覺銜接不好,有點(diǎn)亂。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • ASP.NET Core 數(shù)據(jù)保護(hù)(Data Protection 集群場景)下篇
  • ASP.NET Core 數(shù)據(jù)保護(hù)(Data Protection)中篇
  • ASP.NET Core 數(shù)據(jù)保護(hù)(Data Protection)上篇
  • ASP.NET Core Kestrel 中使用 HTTPS (SSL)
  • ASP.NET Core集成微信登錄
  • 微信搶紅包ASP.NET代碼輕松實(shí)現(xiàn)
  • 基于ASP.NET實(shí)現(xiàn)日期轉(zhuǎn)為大寫的漢字
  • ASP.NET MVC5網(wǎng)站開發(fā)之用戶資料的修改和刪除3(七)
  • ASP.NET MVC5網(wǎng)站開發(fā)之用戶角色的后臺(tái)管理1(七)
  • ASP.NET 程序員都非常有用的85個(gè)工具

標(biāo)簽:湖北 綏化 試駕邀約 焦作 欽州 無錫 湘西 銅陵

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP.NET MVC5網(wǎng)站開發(fā)之用戶添加和瀏覽2(七)》,本文關(guān)鍵詞  ASP.NET,MVC5,網(wǎng),站開,發(fā)之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《ASP.NET MVC5網(wǎng)站開發(fā)之用戶添加和瀏覽2(七)》相關(guān)的同類信息!
  • 本頁收集關(guān)于ASP.NET MVC5網(wǎng)站開發(fā)之用戶添加和瀏覽2(七)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    日本福利午夜视频在线| 国产欧美综合一区| bt电影在线| 欧美日韩在线影院| 一级中文字幕一区二区| 99国内精品久久| 91久久人澡人人添人人爽欧美| 日韩一级在线观看| 亚洲免费在线观看av| 2019中文在线观看| 先锋成人影院| 亚洲黄色小视频| 精品嫩草影院久久| 亚洲综合自拍一区| 欧美午夜网站| 免费国产自线拍一欧美视频| 日韩精品亚洲专区| 波多野结衣视频在线播放| 亚洲精品自拍动漫在线| 精品国产免费人成在线观看| 欧美mv日韩mv国产网站app| 欧美午夜大胆人体| 天天色综合av| 久久久久久亚洲精品中文字幕| 欧美激情在线观看视频免费| 久久视频这里只有精品| 日韩精品中文字幕久久臀| 男生和女生一起差差差视频| av手机免费观看| 亚洲视频1区| 91综合久久| 亚洲第一综合网| 亚洲第一精品网站| 青春娱乐分类视频精品2动漫| 日韩三级影视| 欧美亚洲自偷自偷| 中文字幕免费精品| 美女视频黄免费的亚洲男人天堂| 国产成人夜间影院在线观看| 国产午夜亚洲精品一级在线| 婷婷亚洲成人| 国产免费av国片精品草莓男男| 麻豆精品视频在线| 一区二区不卡免费视频| 风间由美一区二区三区在线观看| 精品国产3级a| 国产精品揄拍100视频| 91精品婷婷国产综合久久蝌蚪| 激情综合中文娱乐网| 国产主播在线播放| 亚洲欧美日韩不卡一区二区三区| 嫩草国产精品入口| 99.玖玖.com| 可以看毛片的网址| 97av在线播放| 成人国产免费视频| 久久精品一区二区三区av| 亚洲精品97久久中文字幕| 国产亚洲精品美女久久久| 国产精品美女久久久久高潮| av先锋资源| 国产精品久久AV无码| 中文字幕亚洲欧美一区二区三区| 久久久最新网址| 日本电影全部在线观看网站视频| 在线观看中文字幕2021| 婷婷综合久久一区二区三区| 亚洲精品v日韩精品| 精品国模一区二区三区欧美| 欧美性猛交xxxx免费看久久久| a级精品国产片在线观看| 亚洲欧洲日产国码av系列天堂| 久久嫩草捆绑紧缚| 久久不卡日韩美女| 日韩一级精品视频在线观看| 白白操在线视频| 欧美日韩国产成人在线| 先锋资源av在线| av一区二区不卡| 浅井舞香一区二区| 在线天堂www在线国语对白| 亚洲色婷婷综合开心网| 激情综合色综合久久| 精品少妇一区二区| 日韩精品三区四区| 真实国产乱子伦对白在线| 亚洲一区二区三区高清视频| 微拍福利一区二区| 91在线观看免费高清完整版在线观看| 丁香资源影视免费观看| 亚洲精品天堂网| 中文字幕五月欧美| 欧美性xxxx极品hd欧美| 麻豆一区区三区四区产品精品蜜桃| 中文字幕在线播放视频| 免费av片风间由美在线| 久久久久se| www视频在线| 毛片基地一级大毛片| 久久久久久久高潮| 高清欧美性猛交| 亚洲人成人一区二区三区| 日本福利在线观看| 成品人视频ww入口| 最近中文字幕日韩精品| 欧美精品中文字幕亚洲专区| 国产成人三级在线播放| 欧美成人vr18sexvr| 久久365资源| 在线免费观看av片| 成av人片在线观看www| 国产精品bbw一区二区三区| 国产一区二区三区直播精品电影| 日韩欧美电影一区| 8x8x成人免费视频| 少妇精品导航| 欧美绝品在线观看成人午夜影视| 亚洲高清中文字幕| 一区三区视频| 一区二区三区视频播放| 宅男噜噜99国产精品观看免费| 综合图区亚洲白拍在线| 一起操在线视频| 日韩av电影中文字幕| 国产69精品久久777的优势| 国产乱人伦精品一区二区| 青青草原免费观看| 久久精品影视大全| 欧美 日韩 国产精品免费观看| 国产又黄又粗又硬| 欧美日韩一区二区三区四区五区| 成人午夜在线视频| 日韩和的一区二在线| 午夜在线观看免费一区| 99热精品免费| av男人的天堂在线观看| 亚洲国产午夜精品| 国产精品国产高清国产| 91av一区| 亚洲**2019国产| 成人综合婷婷国产精品久久蜜臀| 久久中文精品视频| 国产va在线| 欧美性一二三区| 精华区一区二区三区| 亚洲 国产 图片| www插插插无码免费视频网站| 91精品国产一区二区三区香蕉| 久久免费国产视频| 欧美日韩一区二区视频在线观看| 色综合天天综合网国产成人综合天| 亚洲综合色视频| 加勒比海盗1在线观看免费国语版| 蜜臀一区二区三区精品免费视频| 国产精品家庭影院| 麻豆视频国产| www.av日韩| 国内外成人在线视频| 99久久精品国产亚洲| 午夜伦理大片视频在线观看| 欧美美女啪啪| 国产成人无码一二三区视频| 一本加勒比波多野结衣| 在线看的你懂得| 开心九九激情九九欧美日韩精美视频电影| 91精品久久久久久久91蜜桃| 国产精品第157页| 国产女人精品视频| 91九色精品视频| 又粗又大的机巴好爽欧美| av先锋下载| 亚洲v日本v欧美v久久精品| 日本天堂在线| 久久亚洲国产中v天仙www| 色视频精品视频在线观看| 国产精品∨欧美精品v日韩精品| 亚洲一区二区三区无码久久| 国产日韩精品入口| 免费人成a大片在线观看动漫| 日韩欧美国产黄色| 91国偷自产一区二区三区观看| 久久久久久久人妻无码中文字幕爆| 波多野结衣一二区| 久久久精品一区二区三区| 久久久国产精品黄毛片| 欧美精品在线观看| 日本亚洲欧洲精品| 亚洲aⅴ天堂av在线电影软件| 刘亦菲毛片一区二区三区| 91丨porny丨国产入口| 国产亚洲欧美日韩俺去了| 国产日韩综合| 无码人妻精品一区二区三区9厂| 中文字幕在线观看一区二区| 午夜精品福利视频| 人日人天天爽| 日韩av中文字幕在线播放| 亚洲精品成a人ⅴ香蕉片| 在线观看免费av片| 国产精品麻豆入口| 香蕉成人伊视频在线观看| 亚洲欧美国产高清va在线播| 亚洲护士老师的毛茸茸最新章节| 五月婷婷六月丁香激情| 99久久99久久精品免费看蜜桃| 国产精品久久久久影院| 日韩电影中文字幕在线观看| 国产欧美日韩一区| 欧美一区二区精品在线| 国产精品97在线| 成人性生交大片免费看视频r| ass精品国模裸体欣赏pics| 欧美精品电影免费在线观看| 亚洲日产国产精品| 亚洲AV成人无码一二三区在线| 日韩一区二区三区精品视频| 久久久国产欧美| 亚洲中文字幕无码av永久| 精品一区在线播放| 男女视频在线观看免费| 久久综合一区二区| 97色成人综合网站| 久久av导航| 欧美人与禽zoz0善交| 欧美在线网址| 国产另类ts人妖一区二区| 国产资源在线观看入口av| 美女网站在线| 免费一级suv好看的国产网站| 欧美亚男人的天堂| 久久九九久精品国产免费直播| 亚洲一级高清| 久久6免费高清热精品| 99久久免费精品高清特色大片| 999国产精品| 成人免费视频a| 国产美女在线观看一区| 国产精品免费91| 欧美成人milf| 色视频www在线播放| 欧洲午夜精品| 国产日韩精品久久| 亚洲视频重口味| 欧美色图亚洲| 国产鲁鲁视频在线观看免费| 午夜国产精品理论片久久影院| 国内精品卡一卡二卡三新区| 男男受被啪到高潮自述| 求av网址在线观看| 狠狠88综合久久久久综合网| 伊人av在线com| 日韩亚洲色图| 97在线观看免费高清视频| 国产精品一区二区av交换| 日本网站在线观看一区二区三区| 亚洲一区二区三区四区中文| 精品在线视频一区| 亚洲天堂av免费在线观看| 最近免费中文字幕mv视频| 日本欧美www| 国产成人精品一区二区三区在线观看| 毛片毛片毛片| 国产肉体xxxx裸体784大胆| 韩国欧美国产1区| 黄色成人在线免费观看| av中文字幕免费在线观看| 久久亚洲人体| 亚洲色图27p| 成人黄色a级片| 成人在线视频首页| www.26天天久久天堂| 1024欧美极品| 欧美性xxxx| 久久黄色精品视频| 国产在线视频网| 亚洲色图av在线| 久久另类ts人妖一区二区| 国产精品福利视频| 国产精品女同一区二区三区| 97久久精品在线| 午夜av噜噜噜噜噜噜| 美女网站在线免费欧美精品| 欧美日韩午夜激情| 中文字幕精品无码一区二区| 国产久卡久卡久卡久卡视频精品| 国产一级粉嫩xxxx| 一区二区三区四区视频| 免费一级a毛片夜夜看| 久久免费视频在线观看| 欧美1o一11sex性hdhd| 岛国av午夜精品| 日本中文字幕精品| 日韩在线视频免费看| 国产欧美日韩精品丝袜高跟鞋| 欧美日韩国产免费一区二区三区| 欧美日韩黄色一区二区| 日本女优爱爱视频| 精品日本一区二区| 国产综合色产| 日韩精品欧美国产精品忘忧草| 亚洲欧美国产va在线影院| 两个人日本在线观看视频| 91精品国产自产拍在线观看蜜| 18毛片免费看| 天天插天天操天天射| 一级女性全黄久久生活片免费| 全部a∨一极品视觉盛宴| 亚洲精品在线观看www| 久色婷婷小香蕉久久| 超碰97在线资源站| 国产精品一区二区久久国产| 欧美在线中文字幕| 97人妻精品一区二区三区免费| 精品久久久久久久久久久久久| 午夜视频在线观看精品中文| 精品1卡二卡三卡四卡老狼| 国产成人精品视频在线| 久久久极品av| 在线观看老湿视频福利| 亚洲图片在线综合| 污污的视频免费| 岛国成人毛片| 亚洲综合三区| 少妇久久久久久久| 亚洲成人精品| 韩日欧美一区| 日韩毛片在线| 最近2019中文字幕第三页视频|