七、Asp.Net MVC4.0 CMSシステムケースを開発するユーザーグループモジュール


グループ管理は、主に異なる人に対して異なるグループを創立して、ここは主にグループ自身が管理して、グループとユーザーの間の関係については、私はやはり1枚の表で関係を創立したほうがいいと感じて、結局彼らは多対多の関係です.まずコードを見てください.
一、テンプレートModels
    
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Hillstone.Models
{
    public class Group
    {
        [Key]
        public int GroupId { get; set; }

        [Display(Name = "    ")]
        public Nullable<int> UnitId { get; set; }

        [Display(Name = "    ")]
        public string UnitName { get { return Common.Function.getUnitName(this.UnitId); } }
               
        [Display(Name="    ")]
        [Required(ErrorMessage="×")]
        [StringLength(50,ErrorMessage="×")]
        public string GroupName { get; set; }

        [Display(Name="    ")]
        public int GroupType { get; set; }

        [Display(Name = "    ")]
        public string GroupTypeName { get { return Common.Function.getGroupTypeName(this.GroupType); } }

        [Display(Name="  ")]
        [MaxLength(10,ErrorMessage="×")]
        public string OrderNo { get; set; }

        [Display(Name="  ")]
        public string Description { get; set; }

        [Display(Name = "   ID")]
        public Nullable<int> CreatedUserId { get; set; }

        [Display(Name = "   ")]
        [Required(ErrorMessage="×")]
        [StringLength(50,ErrorMessage="×")]
        public string CreatedUserName { get; set; }

        [Display(Name="    ")]
        [Required(ErrorMessage="×")]
        [DataType(DataType.DateTime,ErrorMessage="×")]
        public Nullable<System.DateTime> CreatedDate { get; set; }

        /// <summary>
        ///   
        /// </summary>
        public Nullable<int> Flag { get; set; }
    }
}
リスト表示ページでは、辞書表示を読み込む必要があるデータがあり、データベースには対応するValue値しか保存されていないため、UnitNameやGroupTypeNameなどの属性がget検索器で読み込まれます.しかし、ここはシステムの設定がよくて、データベースから読み込んでいません.もしそうなら、データごとにデータベースをクエリーしなければなりません.効率に影響しますか?やはりコードに列挙や配列を作ったほうがいいのか、ビュークエリを利用して、さらにValueをTextとともにデータテーブルに保存することもできます.
二、コントローラContrallers
この階層は、ユーザー管理と同様にBLLでSysComGroupRepositoryクラスを確立し、IrepositoryBaseから継承するビジネスロジックに関連しています.ここでは、いくつかのデータ操作方法を定義します.まず、データベース接続クラスを定義します.
private HillstoneContext db = new HillstoneContext();
AUCDメソッドの定義
        /// <summary>
        ///       
        /// </summary>
        /// <param name="Tmodel">          </param>
        /// <returns>TrueOrFalse</returns>
        public override bool Add(Group Tmodel)
        {
            if (Tmodel == null) { return false; }
            db.group.Add(Tmodel);
            if (db.SaveChanges() > 0)
            {
                return true;
            }
            else {
                return false;            
            }
        }

        /// <summary>
        ///       
        /// </summary>
        /// <param name="Tmodel">          </param>
        /// <returns></returns>
        public override bool Update(Group Tmodel)
        {
            if(Tmodel==null){return false;}
            db.group.Attach(Tmodel);
            db.Entry<Group>(Tmodel).State = EntityState.Modified;//using System.Data
            if (db.SaveChanges() > 0) { return true; } else { return false; }
        }

        /// <summary>
        ///         
        /// </summary>
        /// <param name="Id">GroupId</param>
        /// <returns>TrueOrFalse</returns>
        public override bool Delete(int Id)
        {
            db.group.Remove(db.group.SingleOrDefault(g => g.GroupId == Id));
            if (db.SaveChanges() > 0) { return true; } else { return false; }
        }

        /// <summary>
        ///        
        /// </summary>
        /// <param name="Id">GroupID</param>
        /// <returns>         </returns>
        public override Group Find(int Id)
        {
            return db.group.SingleOrDefault(g => g.GroupId == Id);

        }

        /// <summary>
        ///     
        /// </summary>
        /// <returns>    </returns>
        public IQueryable<Group> List() {
            var _group = db.group;
            return _group;        
        }

        /// <summary>
        ///         
        /// </summary>
        /// <param name="groupType">    ID</param>
        /// <returns>    </returns>
        public IQueryable<Group> List(int groupType) {
            return db.group.Where(g => g.GroupType == groupType);       
        }
クエリは配列列用を返します:IQueryableタイプ.
コントローラGroupContrallersでは、ビジネスロジッククラス、共通クラス、テンプレートクラスを参照します.
using Hillstone.Models;
using Hillstone.BLL;
using Hillstone.Common;
2つのビジネスロジッククラスをインスタンス化
        private SysComGroupRepository groupRsy = new SysComGroupRepository();
        private SysComUserRepository userRsy = new SysComUserRepository();
1)リストページが表示され、カテゴリに従ってクエリーを行い、クエリー条件をバインドすることができます.ViewDataに追加し、一度ビューで使用します.クエリー条件get方式でパラメータIDを渡し、検索を行い、-1がすべてです.
        /// <summary>
        ///       
        /// </summary>
        /// <param name="groupType">    :0  1   2  3  4   </param>
        /// <returns></returns>
        public ActionResult List(int Id = -1)
        {
            //    :       
            var _groupTypeList = GroupTypeList(Id);
            _groupTypeList.Insert(0, new SelectListItem() { Value = "-1", Text = "  " });
            ViewData.Add("GroupTypeList", _groupTypeList);

            IQueryable<Group> iGroup;
            if (Id == -1)
            {
                 iGroup = groupRsy.List();
            }
            else
            {
                iGroup = groupRsy.List(Id);
            }

            return View(iGroup);
        }
2)グループ操作を追加し、ViewDataを付与し、ドロップダウン・ボックスに関するデータをバインドし、人を追加し、時間、状態などのデフォルトのバックグラウンドを付与する.
        /// <summary>
        ///         
        /// </summary>
        /// <returns></returns>
        [UserAuthorize]
        public ActionResult Create()
        {
            ViewData["UnitId"] = Common.Function.getUnitList(-1);
            ViewData["GroupType"] = GroupTypeList();

            return View();
        }

        /// <summary>
        ///         
        /// </summary>
        /// <param name="group"></param>
        /// <returns></returns>
        [UserAuthorize]
        [HttpPost]
        public ActionResult Create(Group group)
        {
            ViewData["UnitId"] = Common.Function.getUnitList(group.UnitId);
            ViewData["GroupType"] = GroupTypeList();

            HttpCookie _cookie = HttpContext.Request.Cookies["user"];
            User _user = userRsy.Find(_cookie["loginname"].ToString());
            group.CreatedUserId = _user.UnitId;
            group.CreatedUserName = _user.UserName;
            group.CreatedDate = DateTime.Now;
            group.Flag = 1;

            if (groupRsy.Add(group))
            {
                ModelState.AddModelError("Message", "  !");
            }
            else
            {
                ModelState.AddModelError("Message", "  ");
            }
            return View();
        }
3)グループ情報を削除し、ViewページはJQuery技術でこのメソッドを直接呼び出し、ここではビューパスではなくブール値を返すことに注意します.JsonResultではリフレッシュレス削除が可能で、使わなければ削除できますが更新ページがコミットされます.
        /// <summary>
        ///     
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        [HttpPost]
        public bool JsonResult(int Id = -1) {
            var _group = groupRsy.Find(Id);
            if (_group != null)
            {
                groupRsy.Delete(Id);
                return Json(true);

            }
            else
            {
                return Json(false);
            }
        }
4)アクションの表示
        /// <summary>
        ///       
        /// </summary>
        /// <param name="Id">  ID</param>
        /// <returns></returns>
        public ActionResult Details(int Id)
        {
            var _group = groupRsy.Find(Id);
            return View(_group);
        }
5)修正操作
      /// <summary>
        ///     
        /// </summary>
        /// <param name="Id">  ID</param>
        /// <returns></returns>
        public ActionResult Edit(int Id)
        {      
            var _group = groupRsy.Find(Id);
            ViewData["UnitId"] = Common.Function.getUnitList(_group.UnitId);
            ViewData["GroupType"] = GroupTypeList(_group.GroupType);
            return View(_group);
        }

        /// <summary>
        ///       
        /// </summary>
        /// <param name="group">    </param>
        /// <returns></returns>
        [AdminAuthorize]
        [HttpPost]
        public ActionResult Edit(SysComGroup group)
        {
            ViewData["UnitId"] = Common.Function.getUnitList(group.UnitId);
            ViewData["GroupType"] = GroupTypeList(group.GroupType);
            if (ModelState.IsValid)
            {
                //db.Configuration.ValidateOnSaveEnabled = false;
                if (groupRsy.Update(group))
                {
                    ModelState.AddModelError("Message", "    !");

                }
                else
                {
                    ModelState.AddModelError("Message", "    !");
                }
                //db.Configuration.ValidateOnSaveEnabled = true;
            }
                    return View();
        }
三、ビュービューViewコードは、一時的に3つある:1つのリストページのリスト.cshtml、追加ページ:Create.cshtml、デフォルト表示ページ:Details.cshtml
1)リストページ、クエリー条件:グループタイプドロップダウン・ボックスが表示されます.これは、コントローラのViewDataにバインドされているため、ここで呼び出すことができます.変更を選択するとChangeメソッドが呼び出され、IDパラメータがバックグラウンドに読み出されます.
  <th colspan="7">@Html.DropDownList("GroupTypeList")</th>
  
      $("#GroupTypeList").change(function(){
        location.href="/Group/List/"+$(this).children("option:selected").val();
    })
データベースでは組織機構に対してグループタイプがValue値であるが,モデルでは既に処理されており,詳細は上のコードを参照する.ここでは直接呼び出すことができます.
    @Html.DisplayNameFor(model => model.UnitName)
    @Html.DisplayNameFor(model => model.GroupTypeName)
表示不要な内容を削除します.
データの削除操作はjs操作でバックグラウンドを操作し,戻り結果を判断する.
 <a href="javascript:void(0)" onclick="Delete(@item.GroupId,'@item.GroupName')">  </a>
 
     function Delete(id, name)
    {
        if (confirm("      " + name + "?")) {
            $.post("@Url.Content("~/Group/Delete")", { Id: id }, function (data) {
                if(data){
                    alert("    !");
                    location.reload();
                }
            })
        }
    }
2)ページを追加し、もう一度ドロップダウンボックスを見る方法.
@Html.DropDownListFor(model => model.UnitId,ViewData["UnitId"] as SelectList)
@Html.DropDownListFor(model => model.GroupType,ViewData["GroupType"] as SelectList)
3)ページを修正して表示内容を調整すればよい.他にはあまり差がありません.