DDDドメイン駆動設計の予備検討(7):Web層の構築_html/css_WEB-ITnose

WBOY
リリース: 2016-06-24 11:21:07
オリジナル
1306 人が閲覧しました

はじめに: 毎日忙しくてブログを更新していませんでした。今日は、コードの改善を続けましょう。これまでの 6 つの記事で、ドメイン層、アプリケーション層、インフラストラクチャ層のコードの一部が完成しました。この記事では、UI 層のコードを構築する予定です。

1. UI レイヤーの概要

DDD では、UI レイヤーの設計も BS と CS に分かれています。この記事では Web を例に説明します。私たちの Web は MVC+ブートストラップ アーキテクチャを使用しています。 Table コンポーネントがブートストラップ テーブルを使用する理由は、API が比較的完成されており、そのスタイルが PC を問わずあらゆる種類のデバイスに適しているとブロガーが感じたためです。または携帯電話の一種。

ブートストラップ API の関連アドレスはここに掲載されています。

Bootstrap 中国語 Web サイト: http://www.bootcss.com/

Bootstrap テーブルのデモ: http://issues.wenzhixin.net.cn/bootstrap-table/index.html

Bootstrap テーブル API: http:/ /bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/

ブートストラップ テーブルのソース コード: https://github.com/wenzhixin/bootstrap-table

ブートストラップ データピッカー: http://www.bootcss. com /p/bootstrap-datetimepicker/

ブートストラップ オフライン API

2. コード例

WCF 設計コードは前の記事で完成しましたが、具体的なビジネス ロジック コードはまだ利用できません。特定のビジネス。

1. WCF コード

1.1 WCF サービス ビジネス インターフェイス コード

    ///     /// 权限管理模块接口契约    ///     [ServiceContract]    [ServiceInterface]    public interface IPowerManageWCFService    {        #region 用户管理        [OperationContract]        List GetUsers(ExpressionNode expressionNode);        [OperationContract]        DTO_TB_USERS AddUser(DTO_TB_USERS oUser);        [OperationContract]        bool DeleteUser(DTO_TB_USERS oUser);        [OperationContract]        bool DeleteUserByLamada(ExpressionNode expressionNode);        [OperationContract]        bool UpdateUser(DTO_TB_USERS oUser);        #endregion        #region 部门管理        [OperationContract]        List GetDepartments(ExpressionNode expressionNode);        [OperationContract]        DTO_TB_DEPARTMENT AddDepartment(DTO_TB_DEPARTMENT oDept);        [OperationContract]        bool DeleteDepartment(DTO_TB_DEPARTMENT oDept);        [OperationContract]        bool DeleteDeptByLamada(ExpressionNode expressionNode);        [OperationContract]        bool UpdateDepartment(DTO_TB_DEPARTMENT oDept);        #endregion        #region 角色管理        [OperationContract]        List GetRoles(ExpressionNode expressionNode);        [OperationContract]        DTO_TB_ROLE AddRole(DTO_TB_ROLE oRole);        #endregion        #region 菜单管理        [OperationContract]        List GetMenus(ExpressionNode expressionNode);        [OperationContract]        DTO_TB_MENU AddMenu(DTO_TB_MENU oMenu);        #endregion    }
ログイン後にコピー

[ServiceClass]    public class PowerManageWCFService :BaseService, IPowerManageWCFService    {        #region Fields        [Import]        private IUserRepository userRepository { get; set; }        [Import]        private IDepartmentRepository departmentRepository { get; set; }        [Import]        private IRoleRepository roleRepository { get; set; }        [Import]        private IMenuRepository menuRepository { get; set; }         #endregion        #region Constust        public PowerManageWCFService()        {        }        #endregion        #region WCF服务接口实现        #region 用户管理        //这里参数为什么不直接用Expression>这种类型,是因为Expression不支持序列化,无法用于WCF数据的传递        public List GetUsers(ExpressionNode expressionNode)        {            Expressionbool>> selector = null;            if (expressionNode != null)            {                selector = expressionNode.ToExpressionbool>>();            }            var lstRes = base.GetDtoByLamada(userRepository, selector);            return lstRes;        }        public DTO_TB_USERS AddUser(DTO_TB_USERS oUser)        {            return base.AddDto(userRepository, oUser);        }        public bool DeleteUser(DTO_TB_USERS oUser)        {            var bRes = false;            try            {                base.DeleteDto(userRepository, oUser);                bRes = true;            }            catch            {             }            return bRes;        }        public bool DeleteUserByLamada(ExpressionNode expressionNode)        {            Expressionbool>> selector = null;            if (expressionNode != null)            {                selector = expressionNode.ToExpressionbool>>();            }            var bRes = false;            try            {                base.DeleteDto(userRepository, selector);                bRes = true;            }            catch            {            }            return bRes;        }        public bool UpdateUser(DTO_TB_USERS oUser)        {            var bRes = false;            try            {                base.UpdateDto(userRepository, oUser);                bRes = true;            }            catch            {            }            return bRes;        }        #endregion        #region 部门管理        public List GetDepartments(ExpressionNode expressionNode)        {            Expressionbool>> selector = null;            if (expressionNode != null)            {                selector = expressionNode.ToExpressionbool>>();            }            return base.GetDtoByLamada(departmentRepository, selector);        }        public DTO_TB_DEPARTMENT AddDepartment(DTO_TB_DEPARTMENT oDept)        {            return base.AddDto(departmentRepository, oDept);        }        public bool DeleteDepartment(DTO_TB_DEPARTMENT oDept)        {            var bRes = false;            try            {                base.DeleteDto(departmentRepository, oDept);                bRes = true;            }            catch            {             }            return bRes;        }        public bool DeleteDeptByLamada(ExpressionNode expressionNode)        {            Expressionbool>> selector = null;            if (expressionNode != null)            {                selector = expressionNode.ToExpressionbool>>();            }            var bRes = false;            try            {                base.DeleteDto(departmentRepository, selector);                bRes = true;            }            catch            {            }            return bRes;        }        public bool UpdateDepartment(DTO_TB_DEPARTMENT oDept)        {            var bRes = false;            try            {                base.UpdateDto(departmentRepository, oDept);                bRes = true;            }            catch            {             }            return bRes;        }        #endregion        #region 角色管理        public List GetRoles(ExpressionNode expressionNode)        {            Expressionbool>> selector = null;            if (expressionNode != null)            {                selector = expressionNode.ToExpressionbool>>();            }            return base.GetDtoByLamada(roleRepository, selector);        }        public DTO_TB_ROLE AddRole(DTO_TB_ROLE oRole)        {            return base.AddDto(roleRepository, oRole);        }        #endregion        #region 菜单管理        public List GetMenus(ExpressionNode expressionNode)        {            Expressionbool>> selector = null;            if (expressionNode != null)            {                selector = expressionNode.ToExpressionbool>>();            }            return base.GetDtoByLamada(menuRepository, selector);        }        public DTO_TB_MENU AddMenu(DTO_TB_MENU oMenu)        {            return base.AddDto(menuRepository, oMenu);        }        #endregion        #endregion    }
ログイン後にコピー

ここで 1 つ説明します。lamada 式を介したクエリのメソッドで Expression> を直接使用しないのはどうでしょうか。このタイプの ExpressionNode の変数を使用しますか?

これは、Expression がシリアル化をサポートしておらず、WCF データの転送に使用できないためです。 ExpressionNode オブジェクトを使用するには、DLL Serialize.Linq への参照を追加する必要があります。幸いなことに、魔法の NuGet を使用すると、オンラインで大量の DLL を検索する必要がなくなりました。

私たちのパブリックな追加、削除、変更、チェックは、親クラスの BaseService にカプセル化されます。

1.3 BaseService コード

public class BaseService    {        #region Fields        private bool bInitAutoMapper = false;        #endregion        #region Construct         public BaseService()        {            //注册MEF            Regisgter.regisgter().ComposeParts(this);        }        #endregion        #region 查询        ///         /// 通用单表查询方法        ///         /// DTOmodel        /// 领域模型        /// 需要传过来的仓储接口对象        /// 前端传过来的lamada表达式        ///         public List GetDtoByLamada(IRepository oRepository, Expressionbool>> selector = null)            where DomainModel : AggregateRoot            where DtoModel : Dto_BaseModel        {            InitAutoMapper();            if (selector == null)            {                var lstDomainModel = oRepository.Entities.ToList();                return Mapper.Map, List>(lstDomainModel);            }            //得到从Web传过来和DTOModel相关的lamaba表达式的委托            Funcbool> match = selector.Compile();            //创建映射Expression的委托            Func mapper = AutoMapper.QueryableExtensions.Extensions.CreateMapExpression(Mapper.Engine).Compile();            //得到领域Model相关的lamada            Expressionbool>> lamada = ef_t => match(mapper(ef_t));            List list = oRepository.Find(lamada).ToList();            return Mapper.Map, List>(list);        }         #endregion        #region 新增        public DtoModel AddDto(IRepository oRepository, DtoModel oDtoModel)            where DomainModel : AggregateRoot            where DtoModel : Dto_BaseModel        {            InitAutoMapper();            var oDomain = Mapper.Map(oDtoModel);            oRepository.Insert(oDomain);            return Mapper.Map(oDomain);        }        #endregion        #region 删除        public int DeleteDto(IRepository oRepository, DtoModel oDtoModel)            where DomainModel : AggregateRoot            where DtoModel : Dto_BaseModel        {            InitAutoMapper();            var oDomain = Mapper.Map(oDtoModel);            return oRepository.Delete(oDomain);        }        public int DeleteDto(IRepository oRepository, Expressionbool>> selector = null)            where DomainModel : AggregateRoot            where DtoModel : Dto_BaseModel        {            InitAutoMapper();            if (selector == null)            {                return 0;            }            //得到从Web传过来和DTOModel相关的lamaba表达式的委托            Funcbool> match = selector.Compile();            //创建映射Expression的委托            Func mapper = AutoMapper.QueryableExtensions.Extensions.CreateMapExpression(Mapper.Engine).Compile();            //得到领域Model相关的lamada            Expressionbool>> lamada = ef_t => match(mapper(ef_t));            return oRepository.Delete(lamada);        }         #endregion        #region 更新        public void UpdateDto(IRepository oRepository, DtoModel oDtoModel)            where DomainModel : AggregateRoot            where DtoModel : Dto_BaseModel        {            InitAutoMapper();            var oDomain = Mapper.Map(oDtoModel);            oRepository.Update(oDomain);        }        #endregion        #region Private        private void InitAutoMapper()        {            var oType = Mapper.FindTypeMapFor();            if (oType==null)            {                Mapper.CreateMap();                Mapper.CreateMap();            }        }        #endregion    }
ログイン後にコピー

この親クラスは主に 2 つのことを行います: 1 つは MEF の初期化で、もう 1 つは一般的な追加、削除、変更、クエリの実装です。すべての dto オブジェクトとドメイン モデルのマッピングは、ここで均一に管理されます。

2. UI レイヤー コード

UI レイヤーでは、コードをより適切に分離するために、図に示すように、インターフェイス プログラミング メカニズムを導入し、ESTM.Web.IBLL と ESTM.Web.BLL という 2 つのプロジェクトを導入しました。 :

なぜそのようなインターフェイス層があるのでしょうか? MEF 実装設計 (最終章: インターフェイス指向プログラミング) の記事「疎結合」は以前紹介したことがありますので、インターフェイス指向プログラミングを知らない友人も読むことができます。

2.1 ESTM.Web.IBLL コード

この DLL は主にインターフェイス ルールを定義します。

 public interface IPowerManager    {        List GetUsers(Expressionbool>> selector = null);        DTO_TB_USERS AddUser(DTO_TB_USERS oUser);        bool DeleteUser(DTO_TB_USERS oUser);        bool UpdateUser(DTO_TB_USERS oUser);        bool DeleteUser(Expressionbool>> selector = null);        List GetDepartments(Expressionbool>> selector = null);        DTO_TB_DEPARTMENT AddDepartment(DTO_TB_DEPARTMENT oDept);        bool DeleteDepartment(DTO_TB_DEPARTMENT oDept);        bool DeleteDepartment(Expressionbool>> selector = null);        bool UpdateDepartment(DTO_TB_DEPARTMENT oDept);        List GetRoles(Expressionbool>> selector = null);        List GetMenus(Expressionbool>> selector = null);    }
ログイン後にコピー

2.2 ESTM.Web.BLL コード

この dll は、ESTM.Web.IBLL のインターフェイス メソッドを実装するために使用されます

[Export(typeof(IPowerManager))]    public class PowerManager : IPowerManager    {        #region Fields     //创建WCF服务连接对象        private ServiceReference_PowerManager.PowerManageWCFServiceClient oService = CreatePowerManagerService.GetInstance();         #endregion        #region 接口实现        public List GetUsers(Expressionbool>> selector = null)        {            return oService.GetUsers(GetExpressionNode(selector));        }        public List GetDepartments(Expressionbool>> selector = null)        {            return oService.GetDepartments(GetExpressionNode(selector));        }        public List GetRoles(Expressionbool>> selector = null)        {            return oService.GetRoles(GetExpressionNode(selector));        }        public List GetMenus(Expressionbool>> selector = null)        {            return oService.GetMenus(GetExpressionNode(selector));        }         #endregion        #region Privates        //将lamada表达式转换为可用于WCF传递的ExpressionNode类型        private ExpressionNode GetExpressionNode(Expressionbool>> selector)        {            if (selector == null)            {                return null;            }            ExpressionConverter expressionConverter = new ExpressionConverter();            ExpressionNode expressionNode = expressionConverter.Convert(selector);            return expressionNode;        }        #endregion        public DTO_TB_USERS AddUser(DTO_TB_USERS oUser)        {            return oService.AddUser(oUser);        }        public bool DeleteUser(DTO_TB_USERS oUser)        {            return oService.DeleteUser(oUser);        }        public bool DeleteUser(Expressionbool>> selector = null)        {            if (selector == null)            {                return false;            }            ExpressionConverter expressionConverter = new ExpressionConverter();            ExpressionNode expressionNode = expressionConverter.Convert(selector);            return oService.DeleteUserByLamada(expressionNode);        }        public bool UpdateUser(DTO_TB_USERS oUser)        {            return oService.UpdateUser(oUser);        }        public DTO_TB_DEPARTMENT AddDepartment(DTO_TB_DEPARTMENT oDept)        {            return oService.AddDepartment(oDept);        }        public bool DeleteDepartment(DTO_TB_DEPARTMENT oDept)        {            return oService.DeleteDepartment(oDept);        }        public bool UpdateDepartment(DTO_TB_DEPARTMENT oDept)        {            return oService.UpdateDepartment(oDept);        }        public bool DeleteDepartment(Expressionbool>> selector = null)        {            if (selector == null)            {                return false;            }            ExpressionConverter expressionConverter = new ExpressionConverter();            ExpressionNode expressionNode = expressionConverter.Convert(selector);            return oService.DeleteDeptByLamada(expressionNode);        }    }
ログイン後にコピー

    public class CreatePowerManagerService    {        private static ServiceReference_PowerManager.PowerManageWCFServiceClient oPowerManagerClient = null;        private static object obj = new object();        public static ServiceReference_PowerManager.PowerManageWCFServiceClient GetInstance()        {            lock (obj)            {                if (oPowerManagerClient == null)                {                    oPowerManagerClient = new ServiceReference_PowerManager.PowerManageWCFServiceClient();                }            }            return oPowerManagerClient;        }    }
ログイン後にコピー

WCF サービスはサービス参照を追加することで参照されるため、この層ではWCF サービスへの参照を追加する必要があります。ブロガーはコードのこの部分を実装する際に問題に遭遇したので、それを友人と共有したいと思います。 DTO オブジェクトは WCF サービスの設計で使用されるため、DTO は ESTM.Web.BLL プロジェクトでも使用されます。ただし、WCF サービス参照を追加する場合、デフォルトは ESTM.Common ではなく、WCF サービスの DTO になります。これは、DtoModel プロジェクトの DTO オブジェクトに関する問題です。dto の内容を変更する必要があるたびに、サービス参照を更新する必要があります。幸いなことに、Microsoft は選択するためのメカニズムを提供してくれました

これで上記の問題は解決されます。

2.3 ESTM.Web コード

インターフェイス指向のメカニズムに従って、ESTM.Web プロジェクトは実装層プロジェクト ESTM.Web.BLL への参照を追加する必要はありません。ESTM.Web.BLL 内のオブジェクトは動的に作成されます。 MEFを通じてインポートされました。コードを見てみましょう:

public class PowerManagerController : BaseController    {        [Import]        private IPowerManager PowerManager { set; get; }        #region Views        // GET: PowerManager        public ActionResult User()        {            return View();        }        public ActionResult Role()        {            return View();        }        public ActionResult Menu()        {            return View();        }        public ActionResult Department()        {            return View();        }         #endregion        #region 部门管理        public JsonResult GetDepartments(int limit, int offset, string departmentname, string statu)        {            //得到lamada表达式            var oLamadaExtention = new LamadaExtention();            if (!string.IsNullOrEmpty(departmentname))            {                oLamadaExtention.GetExpression("DEPARTMENT_NAME", departmentname, ExpressionType.Contains);            }            if (!string.IsNullOrEmpty(statu))            {                oLamadaExtention.GetExpression("STATUS", statu, ExpressionType.Contains);            }            var lamada = oLamadaExtention.GetLambda();            var lstRes = PowerManager.GetDepartments(lamada);            return Json(new { rows = lstRes.Skip(offset).Take(limit).ToList(), total = lstRes.Count }, JsonRequestBehavior.AllowGet);        }        public object GetDepartmentEdit(string strPostData)        {            var oDepartment = Newtonsoft.Json.JsonConvert.DeserializeObject(strPostData);            if (string.IsNullOrEmpty(oDepartment.DEPARTMENT_ID))            {                oDepartment.DEPARTMENT_ID = Guid.NewGuid().ToString();                oDepartment = PowerManager.AddDepartment(oDepartment);            }            else            {                PowerManager.UpdateDepartment(oDepartment);            }            return oDepartment;        }        public object DeleteDept(string strID)        {            PowerManager.DeleteDepartment(x=>x.DEPARTMENT_ID == strID);            return new object();        }        #endregion        #region 菜单管理        public JsonResult GetMenus(int limit, int offset, string menuname, string menuurl)        {            var oLamadaExtention = new LamadaExtention();            if (!string.IsNullOrEmpty(menuname))            {                oLamadaExtention.GetExpression("MENU_NAME", menuname, ExpressionType.Contains);            }            if (!string.IsNullOrEmpty(menuurl))            {                oLamadaExtention.GetExpression("MENU_URL", menuurl, ExpressionType.Contains);            }            var lamada = oLamadaExtention.GetLambda();            var lstRes = PowerManager.GetMenus(lamada).ToList();            return Json(new { rows = lstRes.Skip(offset).Take(limit).ToList(), total = lstRes.Count }, JsonRequestBehavior.AllowGet);        }        public object GetMenuEdit(string strPostData)        {            var oMenu = Newtonsoft.Json.JsonConvert.DeserializeObject(strPostData);            if (string.IsNullOrEmpty(oMenu.MENU_ID))            {                //oMenu = MenuManager.Add(oMenu);            }            else            {                //MenuManager.Update(oMenu);            }            return oMenu;        }        public object DeleteMenu(string strID)        {            //MenuManager.Delete(strID);            return new object();        }        public object GetParentMenu()        {            var lstMenu = PowerManager.GetMenus(x => x.MENU_LEVEL == "1");            //var lstRes = RoleManager.Find().ToList();            //var oRes = new PageRowData();            //oRes.rows = lstRes.Skip(offset).Take(limit).ToList();            //oRes.total = lstRes.Count;            return lstMenu; ;        }        public object GetChildrenMenu(string strParentID)        {            var lstMenu = PowerManager.GetMenus(x => x.MENU_LEVEL == "2" & x.PARENT_ID == strParentID).ToList();            //var lstRes = RoleManager.Find().ToList();            //var oRes = new PageRowData();            //oRes.rows = lstRes.Skip(offset).Take(limit).ToList();            //oRes.total = lstRes.Count;            return lstMenu; ;        }        #endregion        #region 权限管理        public JsonResult GetRole(int limit, int offset, string rolename, string desc)        {            var oLamadaExtention = new LamadaExtention();            if (!string.IsNullOrEmpty(rolename))            {                oLamadaExtention.GetExpression("ROLE_NAME", rolename, ExpressionType.Contains);            }            if (!string.IsNullOrEmpty(desc))            {                oLamadaExtention.GetExpression("DESCRIPTION", desc, ExpressionType.Contains);            }            var lamada = oLamadaExtention.GetLambda();            var lstRes = PowerManager.GetRoles(lamada).ToList();            return Json(new { rows = lstRes.Skip(offset).Take(limit).ToList(), total = lstRes.Count }, JsonRequestBehavior.AllowGet);        }        #endregion        #region 用户管理        public JsonResult GetUsers(int limit, int offset, string username, string fullname)        {            var oLamadaExtention = new LamadaExtention();            if (!string.IsNullOrEmpty(username))            {                oLamadaExtention.GetExpression("USER_NAME", username, ExpressionType.Contains);            }            if (!string.IsNullOrEmpty(fullname))            {                oLamadaExtention.GetExpression("FULLNAME", fullname, ExpressionType.Contains);            }            var lamada = oLamadaExtention.GetLambda();            var lstRes = PowerManager.GetUsers(lamada).ToList();            return Json(new { rows = lstRes.Skip(offset).Take(limit).ToList(), total = lstRes.Count }, JsonRequestBehavior.AllowGet);        }        public object GetUserEdit(string strPostData)        {            var oUser = Newtonsoft.Json.JsonConvert.DeserializeObject(strPostData);            if (string.IsNullOrEmpty(oUser.USER_ID))            {                oUser.USER_ID = Guid.NewGuid().ToString();                oUser = PowerManager.AddUser(oUser);            }            else            {                PowerManager.UpdateUser(oUser);            }            return oUser;        }        public object DeleteUser(string strID)        {            PowerManager.DeleteUser(x => x.USER_ID == strID);            return new object();        }        #endregion    }
ログイン後にコピー

ページを表示

<!DOCTYPE html><html><head>    <meta name="viewport" content="width=device-width" />    <title>@ViewBag.Title</title>    @Styles.Render("~/Content/css")    @Styles.Render("~/Content/table-css")    @Scripts.Render("~/bundles/jquery")    @Scripts.Render("~/bundles/bootstrap")    @Scripts.Render("~/bundles/bootstrap-table")    @RenderSection("Scripts", false)</head><body>    @RenderBody()</body></html>
ログイン後にコピー

@{    ViewBag.Title = "部门管理";    Layout = "~/Views/Shared/_Layout.cshtml";}@Scripts.Render("~/bundles/PowerManage/DepartmentManage")<div class="panel-body" style="padding-bottom:0px;">    <div class="panel panel-default">        <div class="panel-heading">查询条件</div>        <div class="panel-body">            <div class="row">                <div class="col-md-4">                    <label for="txt_search_departmentname" class="col-sm-4 control-label" style="margin-top:6px;">部门名称</label>                    <span class="col-sm-8">                        <input type="text" class="form-control" id="txt_search_departmentname">                    </span>                </div>                <div class="col-md-4">                    <label for="txt_search_statu" class="col-sm-3 control-label" style="margin-top:6px;">状态</label>                    <span class="col-sm-8">                        <input type="text" class="form-control" id="txt_search_statu">                    </span>                </div>                <div class="col-md-4">                    <button type="button" id="btn_query" class="btn btn-primary">查询</button>                </div>            </div>        </div>    </div></div><div id="toolbar" class="btn-group">    <button id="btn_add" type="button" class="btn btn-default">        <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>新增    </button>    <button id="btn_edit" type="button" class="btn btn-default">        <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>修改    </button>    <button id="btn_delete" type="button" class="btn btn-default">        <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>删除    </button></div><table id="tb_departments"></table><form>    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">        <div class="modal-dialog" role="document">            <div class="modal-content">                <div class="modal-header">                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>                    <h4 class="modal-title" id="myModalLabel">新增</h4>                </div>                <div class="modal-body">                    <div class="form-group">                        <label for="txt_departmentname">部门名称</label>                        <input type="text" name="txt_departmentname" class="form-control" id="txt_departmentname" placeholder="部门名称">                    </div>                    <div class="form-group">                        <label for="txt_parentdepartment">上级部门</label>                        <input type="text" name="txt_parentdepartment" class="form-control" id="txt_parentdepartment" placeholder="上级部门">                    </div>                    <div class="form-group">                        <label for="txt_departmentlevel">部门级别</label>                        <input type="text" name="txt_departmentlevel" class="form-control" id="txt_departmentlevel" placeholder="部门级别">                    </div>                    <div class="form-group">                        <label for="txt_statu">状态</label>                        <input type="text" name="txt_statu" class="form-control" id="txt_statu" placeholder="状态">                    </div>                </div>                <div class="modal-footer">                    <button type="button" class="btn btn-default" data-dismiss="modal"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span>关闭</button>                    <button type="button" id="btn_submit" class="btn btn-primary" data-dismiss="modal"><span class="glyphicon glyphicon-floppy-disk" aria-hidden="true"></span>保存</button>                </div>            </div>        </div>    </div></form>
ログイン後にコピー

JS コード 他のページも同様です:

$(function () {    $('#tb_departments').bootstrapTable({        url: '/PowerManager/GetDepartments',        method: 'post',        toolbar: '#toolbar',        pagination: true,        queryParams: queryParams,        queryParamsType: "limit",        //ajaxOptions: { departmentname: "", statu: "" },        sidePagination: "server",        pageSize: 5,        pageList: [5, 25, 50, 100],        search: true,        strictSearch: true,        showColumns: true,        showRefresh: true,        minimumCountColumns: 2,        clickToSelect: true,        columns: [{            checkbox: true        }, {            field: 'DEPARTMENT_NAME',            title: '部门名称'        }, {            field: 'PARENT_ID',            title: '上级部门'        }, {            field: 'DEPARTMENT_LEVEL',            title: '部门级别'        }, {            field: 'STATUS',            title: '状态'        }, ],        onLoadSuccess: function (data) {            var odata = data;        }    });    var oButtonInit = new ButtonInit();    oButtonInit.Init();});function queryParams(params) {  //配置参数    var temp = {   //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的        limit: params.limit,   //页面大小        offset: params.offset,  //页码        departmentname: $("#txt_search_departmentname").val(),        statu: $("#txt_search_statu").val()    };    return temp;}var ButtonInit = function () {    var oInit = new Object();    var postdata = {};    oInit.Init = function () {        $("#btn_add").click(function () {            $("#myModalLabel").text("新增");            $("#myModal").find(".form-control").val("");            $('#myModal').modal()            postdata.DEPARTMENT_ID = "";        });        $("#btn_edit").click(function () {            var arrselections = $("#tb_departments").bootstrapTable('getSelections');            if (arrselections.length > 1) {                //alert("只能选择一行进行编辑");                $("#btn_alert").alert();                return;            }            if (arrselections.length <= 0) {                //alert("请先选择需要编辑的行");                $("#btn_alert").alert()                return;            }            $("#myModalLabel").text("编辑");            $("#txt_departmentname").val(arrselections[0].DEPARTMENT_NAME);            $("#txt_parentdepartment").val(arrselections[0].PARENT_ID);            $("#txt_departmentlevel").val(arrselections[0].DEPARTMENT_LEVEL);            $("#txt_statu").val(arrselections[0].STATUS);            postdata.DEPARTMENT_ID = arrselections[0].DEPARTMENT_ID;            $('#myModal').modal();        });        $("#btn_delete").click(function () {            var arrselections = $("#tb_departments").bootstrapTable('getSelections');            if (arrselections.length <= 0) {                //alert("请先选择需要编辑的行");                $("#btn_alert").alert()                return;            }            if (!confirm("确定要删除选定的数据吗?")) {                return;            }            $.ajax({                type: "post",                url: "/PowerManager/DeleteDept",                data: { strID: arrselections[0].DEPARTMENT_ID },                success: function (data, status) {                    if (status == "success") {                        alert("提交数据成功");                        $("#tb_departments").bootstrapTable('refresh');                    }                },                error: function () {                    alert("error");                },                complete: function () {                    //alert("complete");                }            });        });        $("#btn_submit").click(function () {            postdata.DEPARTMENT_NAME = $("#txt_departmentname").val();            postdata.PARENT_ID = $("#txt_parentdepartment").val();            postdata.DEPARTMENT_LEVEL = $("#txt_departmentlevel").val();            postdata.STATUS = $("#txt_statu").val();            $.ajax({                type: "post",                url: "/PowerManager/GetDepartmentEdit",                data: { strPostData: JSON.stringify(postdata) },                success: function (data, status) {                    if (status == "success") {                        alert("提交数据成功");                        $("#tb_departments").bootstrapTable('refresh');                    }                },                error: function () {                    //alert("error");                },                complete: function () {                    //alert("complete");                }            });        });        $("#btn_query").click(function () {            $("#tb_departments").bootstrapTable('refresh');        });    };    return oInit;};
ログイン後にコピー

レンダリング:

Up出会い系ページのデータの場合、ブロガー別の問題が発生しました。同じキーを持つオブジェクトが ObjectStateManager にすでに存在していました。 ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。ここに解決策を記録しましょう:

ウェアハウスのパブリック実装クラスで

  public virtual IQueryable Entities  {     get { return UnitOfWork.context.Set(); }  }
ログイン後にコピー

public virtual IQueryable Entities{  get { return UnitOfWork.context.Set().AsNoTracking() as IQueryable; }}
ログイン後にコピー
に変更するだけです。

この時点で、ドメイン モデルから Web フロントエンドまでのコードは基本的に完成しています。例外処理やデータ検証など、多くのコードは完全ではない可能性があります。

DDD ドメイン駆動設計の予備調査に関する一連の記事:

  • 「DDD ドメイン駆動設計の予備検討 (1): アグリゲーション」
  • 「DDD ドメイン駆動設計の予備検討 (2): 倉庫リポジトリ (前編)」
  • 「DDD ドメインの予備検討」 -駆動設計 (3): 倉庫リポジトリ (その 2)」
  • 「DDD ドメイン駆動設計の予備検討 (4): WCF 構築」
  • 「DDD ドメイン駆動設計の予備検討 (5): 利用」 AutoMapper の基礎研究
  • 「DDD ドメイン駆動設計に関する予備研究 (6): ドメイン サービス」
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!