検索
ホームページウェブフロントエンドhtmlチュートリアルDDDドメイン駆動設計の予備検討(7):Web層の構築_html/css_WEB-ITnose

はじめに: 毎日忙しくてブログを更新していませんでした。今日は、コードの改善を続けましょう。これまでの 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 id="新增">新增</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): ドメイン サービス」
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
HTML:構造、CSS:スタイル、JavaScript:動作HTML:構造、CSS:スタイル、JavaScript:動作Apr 18, 2025 am 12:09 AM

Web開発におけるHTML、CSS、およびJavaScriptの役割は次のとおりです。1。HTMLは、Webページ構造を定義し、2。CSSはWebページスタイルを制御し、3。JavaScriptは動的な動作を追加します。一緒に、彼らは最新のウェブサイトのフレームワーク、美学、および相互作用を構築します。

HTMLの未来:ウェブデザインの進化とトレンドHTMLの未来:ウェブデザインの進化とトレンドApr 17, 2025 am 12:12 AM

HTMLの将来は、無限の可能性に満ちています。 1)新機能と標準には、より多くのセマンティックタグとWebComponentsの人気が含まれます。 2)Webデザインのトレンドは、レスポンシブでアクセス可能なデザインに向けて発展し続けます。 3)パフォーマンスの最適化により、応答性の高い画像読み込みと怠zyなロードテクノロジーを通じてユーザーエクスペリエンスが向上します。

HTML対CSS対JavaScript:比較概要HTML対CSS対JavaScript:比較概要Apr 16, 2025 am 12:04 AM

Web開発におけるHTML、CSS、およびJavaScriptの役割は次のとおりです。HTMLはコンテンツ構造を担当し、CSSはスタイルを担当し、JavaScriptは動的な動作を担当します。 1。HTMLは、セマンティクスを確保するためにタグを使用してWebページの構造とコンテンツを定義します。 2。CSSは、セレクターと属性を介してWebページスタイルを制御して、美しく読みやすくします。 3。JavaScriptは、動的でインタラクティブな関数を実現するために、スクリプトを通じてWebページの動作を制御します。

HTML:それはプログラミング言語か何か他のものですか?HTML:それはプログラミング言語か何か他のものですか?Apr 15, 2025 am 12:13 AM

htmlisnotaprogramminglanguage; itisamarkuplanguage.1)htmlStructuresandformatswebcontentusingtags.2)ItworkswithcsssssssssdjavascriptforInteractivity、強化を促進します。

HTML:Webページの構造の構築HTML:Webページの構造の構築Apr 14, 2025 am 12:14 AM

HTMLは、Webページ構造の構築の基礎です。 1。HTMLは、コンテンツ構造とセマンティクス、および使用などを定義します。タグ。 2. SEO効果を改善するために、などのセマンティックマーカーを提供します。 3.タグを介したユーザーの相互作用を実現するには、フォーム検証に注意してください。 4. JavaScriptと組み合わせて、動的効果を実現するなどの高度な要素を使用します。 5.一般的なエラーには、閉じられていないラベルと引用されていない属性値が含まれ、検証ツールが必要です。 6.最適化戦略には、HTTP要求の削減、HTMLの圧縮、セマンティックタグの使用などが含まれます。

テキストからウェブサイトへ:HTMLの力テキストからウェブサイトへ:HTMLの力Apr 13, 2025 am 12:07 AM

HTMLは、Webページを構築するために使用される言語であり、タグと属性を使用してWebページの構造とコンテンツを定義します。 1)htmlは、などのタグを介してドキュメント構造を整理します。 2)ブラウザはHTMLを分析してDOMを構築し、Webページをレンダリングします。 3)マルチメディア関数を強化するなど、HTML5の新機能。 4)一般的なエラーには、閉じられていないラベルと引用されていない属性値が含まれます。 5)最適化の提案には、セマンティックタグの使用とファイルサイズの削減が含まれます。

HTML、CSS、およびJavaScriptの理解:初心者向けガイドHTML、CSS、およびJavaScriptの理解:初心者向けガイドApr 12, 2025 am 12:02 AM

webdevelopmentReliesOnhtml、css、andjavascript:1)htmlStructuresContent、2)cssStylesit、および3)Javascriptaddsinteractivity、形成、

HTMLの役割:Webコンテンツの構造HTMLの役割:Webコンテンツの構造Apr 11, 2025 am 12:12 AM

HTMLの役割は、タグと属性を使用してWebページの構造とコンテンツを定義することです。 1。HTMLは、読みやすく理解しやすいようなタグを介してコンテンツを整理します。 2。アクセシビリティとSEOを強化するには、セマンティックタグなどを使用します。 3. HTMLコードの最適化により、Webページの読み込み速度とユーザーエクスペリエンスが向上する可能性があります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール