MVCAdmin项目知识点记录
1、在过滤器中,用ViewBag类似的东西,要((ViewResult)filterContext.Result).ViewBag。
2、Controller中自己定义的非Action方法中(包括构造方法),使用不了Session,这时获取不到Session。可以使用ViewData、ViewBag存数据。
3、权限验证及菜单读取
我想在BaseController中,根据Session用户角色读取加载菜单,在权限过滤器中验证是否登录,在Action过滤器中验证每次请求是否合法。但这样是不行的,因为在BaseController中没法获取到Session,包括构造方法中,并且权限过滤器中也是在BaseController中构造方法之后运行的。各Controller中的只有Index页面,才进行菜单获取,其他Action是不进行菜单获取的。因此,菜单获取的方法不能放在BaseController中,只能放在Action过滤器中。验证登录和权限,是要求每个Action都要进行的操作,因此这个可以放在使用BaseController解决,这样只需要给BaseController加上权限过滤器就可以了,其他Controller只需要继承就行了。
4、前端页面使用Shared页面,加载各个部分
_ViewStart中,如果页面中不指定Layout = null;,页面都会先加载_ViewStart中定义的布局页。使用@Html.Partial加载,指定的其他布局页,比如菜单页、头部、底部等不变的分布页。使用@RenderBody(),加载各个View视图页。
5、动态加载添加编辑页面导致的jquery validate验证是问题
https://stackoverflow.com/questions/18634629/jquery-validation-on-modal-popup
只能在,点击保存的时候加上验证,其他地方都不行,并且还必须要加上 $('#myModal form').valid(),方法验证才会显示验证错误信息。返回true才执行下一步。
6、添加和修改要分开,因为要具体的权限管理,有的角色可能只要添加
7、在js中使用C# MVC代码,再穿插使用js代码
使用<text></text>标签包裹js代码,这样就会使转换器返回到html模式。如:
function btnFormatter(value, row, index) { var btns = ""; @if (currentMenuModel.actionUrls.Exists(t => t.Equals("Edit", StringComparison.OrdinalIgnoreCase))) { <text>btns += '<button type="button" class="btn btn-info" onclick="edit(\'' + row.id + '\')">修改</button> '</text> } @if (currentMenuModel.actionUrls.Exists(t => t.Equals("Delete", StringComparison.OrdinalIgnoreCase))) { <text>btns += '<button type="button" class="btn btn-danger" onclick="del(\'' + row.id + '\')">删除</button>'</text> } return btns; }