EF+MVC+Bootstrap 项目实践 Day2

一、初识系统

1、一上来先看下路由规则Global.asax.cs

routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

默认路由是homt/index,找到Controllers/HomeController.cs,发现指向Area的Account的Auth控制器的Index视图

public ActionResult Index()
        {
            return RedirectToAction("Index", "Auth", new { Area = "Account"});
        }

2、Index会自动跳到Login

虽然知道没登陆时进首页会跳到登陆页,但不知道原理是什么。。。以前做过的项目,要么是在js的ajax中判断,一种是asp.net后台判断Session。

MVC里不知是怎样判断的,我把index.cshtml注释掉,还是会自动跳到Login。只是登陆后首页变空白了(因为被注释掉了)

下了断点,发现确实是没跳到index的,是跳转之前就有判断。

找到AuthController.cs,注释掉,确实不会自动跳转了,会跳到http://localhost:4337/Account/Auth/Index,并报找不到页面

3、原来是继承了基类

public class AuthController : AdminControllerBase
/// <summary>
        /// 方法执行前,如果没有登录就调整到Passport登录页面,没有权限就抛出信息
        /// </summary>
        /// <param name="filterContext"></param>
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var noAuthorizeAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeIgnoreAttribute), false);
            if (noAuthorizeAttributes.Length > 0)
                return;

            base.OnActionExecuting(filterContext);

            if (this.LoginInfo == null)
            {
                filterContext.Result = RedirectToAction("Login", "Auth", new { Area = "Account"});
                return;
            }    ...后面省略...
        }

基类再继承自ControllerBase,重写了OnActionExecuting方法,在跳转时进行权限判断

(基础知识薄弱呀,一开始登陆页就给个下马威)

4、登陆页

http://localhost:4337/Account/Auth/Login

BootStrap风格,美观大方。

<div class="alert alert-error hide">
    <button class="close" data-dismiss="alert"></button>
    <span>Enter any username and passowrd.</span>
</div>
<form class="form-vertical register-form" action="index.html">
      <h3 class="">Sign Up</h3>
      <p>Enter your account details below:</p>
      <div class="control-group">
        <label class="control-label visible-ie8 visible-ie9">Username</label>
        <div class="controls">
          <div class="input-icon left">
            <i class="icon-user"></i>
            <input class="m-wrap placeholder-no-fix" type="text" placeholder="Username" name="username"/>
          </div>
        </div>
      </div>
      <div class="control-group">
        <label class="control-label visible-ie8 visible-ie9">Password</label>
        <div class="controls">
          <div class="input-icon left">
            <i class="icon-lock"></i>
            <input class="m-wrap placeholder-no-fix" type="password" id="register_password" placeholder="Password" name="password"/>
          </div>
        </div>
      </div>
      <div class="control-group">
        <label class="control-label visible-ie8 visible-ie9">Re-type Your Password</label>
        <div class="controls">
          <div class="input-icon left">
            <i class="icon-ok"></i>
            <input class="m-wrap placeholder-no-fix" type="password" placeholder="Re-type Your Password" name="rpassword"/>
          </div>
        </div>
      </div>
      <div class="control-group">
        <!--ie8, ie9 does not support html5 placeholder, so we just show field title for that-->
        <label class="control-label visible-ie8 visible-ie9">Email</label>
        <div class="controls">
          <div class="input-icon left">
            <i class="icon-envelope"></i>
            <input class="m-wrap placeholder-no-fix" type="text" placeholder="Email" name="email"/>
          </div>
        </div>
      </div>
      <div class="control-group">
        <div class="controls">
          <label class="checkbox">
          <input type="checkbox" name="tnc"/> I agree to the <a href="#">Terms of Service</a> and <a href="#">Privacy Policy</a>
          </label>
          <div id="register_tnc_error"></div>
        </div>
      </div>
      <div class="form-actions">
        <button id="register-back-btn" type="button" class="btn">
        <i class="m-icon-swapleft"></i>  Back
        </button>
        <button type="submit" id="register-submit-btn" class="btn green pull-right">
        Sign Up <i class="m-icon-swapright m-icon-white"></i>
        </button>
      </div>
    </form>

其中两段代码访问不到,不知何故,上面是英文提示输入用户名密码的,下面是注册新用户的,把类名去掉就会显示。

不知是不了解BootStrap还是不了解MVC,或是代码Bug,总之在界面上点来点去就是不会出现这两段代码内容

二、模仿

没想到一个小小登陆页也这么多名堂。以往以验告诉自已,别人的代码看上去都会,真要自已做时马上无从下手。现在就从第一个页面开始做起。

1、把自已那个空的MVC翻出来,清空,从头弄起。

在Controllers上右键,新建控制器Home,再建视图Index.cshtml。

public ActionResult Index()
        {
            return RedirectToAction("Index", "Auth", new { Area = "Account"});
        }

发现示例中有new { Area = "Account"}),有个文件夹叫Areas,还以为是新建文件夹。但在项目上右建,发现有个新建区域,那就是这个了,建好后有MVC相应文件夹和 AreaRegistration。

看来MVC里什么控制器、视图、区域,都要新建相应的,不要自已去建空文件夹和类库,而且在Areas上右键,会有新建区域,在其它地方右键就没有,MVC很看重文件夹和文件命名

2、照猫画虎,建了Auth的Index和Login

在Login的ActionResult前面,有个 [AuthorizeIgnore]属性,暂不知干嘛用的,先不加。

3、公共基类

它有个Common文件夹,放了1个控制器基类和3个Context,不管怎样,照着来吧

不知是MVC版本不同还是怎么着,它可以直接继承ControllerBase,我这不行,除非实现ExecuteCore或改成abstract

关于四大修饰符virtual、override、sealed、abstract,至今没搞清楚。。。留着哪天查查资料整理一下吧

还没完,它重写了OnActionExecuting,虽然不懂,但看名字就是执行Action的时候可以做一些操作,我这也要重写这方法,结果没有这方法可重写。。。

public abstract class ControllerBase : GMS.Framework.Web.ControllerBase

定睛一看,原来它这不是原始的ControllerBase,是自已又封装了一层,OnActionExecuting是自已的方法。。。

时间: 12-08

EF+MVC+Bootstrap 项目实践 Day2的相关文章

EF+MVC+Bootstrap 项目实践 Day3

今天主要是实践BootStrap,模仿着做一下登陆页 这一年多来公司项目用的是EasyUI,用来做ERP.CMS之类的后台管理不错,各种交互基本够用,但样式就不怎么样了. BootStrap比较注重前端,更美观大方,主要在html里控制. 一.引入css public static string StaticFile(this UrlHelper helper, string path) { if (string.IsNullOrWhiteSpace(path)) { return ""

EF+MVC+Bootstrap 项目实践 Day5

一.遗留问题 1.SaveChanges()不报错:查了些资料,没找到什么,但加了Try/Catch是可以的 2.Linq插入默认值:也有很多人有同样困惑,都只有变通方法.一种是改成可空,一种是显式传入默认值 3.查插入默认值资料时,发现好像目前这个叫LinqToSql?和EF还不是一回事?由于基础知识欠缺,只好暂存疑惑,先往下走. 二.登陆

EF+MVC+Bootstrap 项目实践 Day9

今天打算把客户管理做完 一.数据准备 多弄几条数据,好练习分页.搜索,要生成以上数据.随机名字.手机.ID(比如UserId只能1.2.4.6及对应的UserName).Number(两位随机大写英文和3位数字) 1.随机名字.感谢博客园AngelLee2009的一篇文章给我启发,但是略复杂,改进了一下 DECLARE @firstNames VARCHAR(MAX)='芳海亮红君军俊江河湖波杰山燕阳洋涛斌彬宾微伟威薇刚倩' --保存名的集合 DECLARE @lastNames VARCHAR

EF+MVC+Bootstrap 项目实践 Day11

继续完成首页跳转判断 一.用js根据点击判断哪个视图并显示相应提示 如果是首页,就显示首页的提示并去掉breadcrumb导航 如果是具体的页面,就根据DOM判断路径并显示,还要把这一级的折叠展开并把当前视图的a标签加上.active 左侧菜单会闪一下,因为是先载入页面,再判断展开和选中的.这样效果不怎么好,如果是iframe之类,左侧是不动的,不用人为去判断是在哪一级. function LoadMenuTip(){ $("#MenuDiv a[title]").each(funct

asp.net EF+MVC+Bootstrap 通用后台管理系统

开发环境: VS2012或以上 数据库: SQL Server 2008R2或以上 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业Web系统   Framework 业务无关的底层通用机制及功能 Model基类:提供数据传输和底层的最基本的基类及接口 DAL底层:基于EF code first,提供Repository泛型方法及写历史日志 Unti

.Net框架搭建之1、SQL Server EF MVC简单三层框架

.Net简单三层框架简介 简单三层框架,是.Net开发中最最基础的框架了,由 数据访问层.逻辑处理层.表示层组成.一般情况下,在项目中数据模型Model层也是单独一层,但是只是单纯的数据模型不算在业务层划分当中. 好了,框架搭建,如果不了解,可能会觉得难以下手,了解之后,自然知道怎么做,只是其中的步骤,比起单纯的功能开发,是要繁琐不少,下面我们来一步一步搭建属于自己的框架,这里只列出重要步骤,其他未提到的细节可自行摸索. 数据模型Model层创建 数据模型层,首先要创建数据库,再从数据库生成EF

MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

http://www.cnblogs.com/darrenji/p/3809219.html 本篇为系列第一篇,包括: ■ 1.搭建项目■ 2.卸载Entity Framework组件,并安装最新版本■ 3.使用EF Code First创建领域模型和EF上下文■ 4.三层架构设计    □ 4.1 创建DAL层        ※ 4.1.1 MySportsStore.IDAL详解        ※ 4.1.2 MySportsStore.DAL详解 1.搭建项目 MySportsStore.

MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第二篇,包括: ■ 4.三层架构设计    □ 4.2 创建DbSession层 数据访问层的统一入口   

MVC项目实践,在三层架构下实现SportsStore-01

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第一篇,包括: ■ 1.搭建项目■ 2.卸载Entity Framework组件,并安装最新版本■ 3.使用