x509

x509证书一般会用到三类文件,key,csr,crt。

Key是私用密钥,openssl格式,通常是rsa算法。

csr是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。

crt是CA认证后的证书文件(windows下面的csr,其实是crt),签署人用自己的key给你签署的凭证。

1.key的生成

openssl genrsa -des3 -out server.key 2048

这样是生成rsa私钥,des3算法,openssl格式,2048位强度。server.key是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。可以通过以下方法生成没有密码的key:

openssl rsa -in server.key -out server.key

server.key就是没有密码的版本了。

2.生成CA的crt

openssl req -new -x509 -key server.key -out ca.crt -days 3650

生成的ca.crt文件是用来签署下面的server.csr文件。

3.csr的生成方法:

openssl req -new -key server.key -out server.csr

需要依次输入国家,地区,组织,email。最重要的是,有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书。

4.crt生成方法

CSR文件必须有CA的签名才可形成证书. 可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢.

openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key

-CAcreateserial -out server.crt

输入key的密钥后,完成证书生成。

-CA 选项指明用于被签名的csr证书,

-CAkey 选项指明用于签名的密钥。

-CAserial 指明序列号文件,而-CAcreateserial指明文件不存在时自动生成。

最后生成了私用密钥:server.key和自己认证的SSL证书:server.crt

Ubuntu+LAMP+Nginx

好久没有玩linux了, 下午的时候有点时间, 搭了一套环境.

使用的VMware workstation安装的Ubuntu 12 Server, 网络连接使用的NAT, Remove掉了Floppy.

Host是Intel Core i5-4570 3.2GHz的64Bit CPU, Memory 是4G. 配置还可以, 故给VMware配置了1G的Memory, 20G的Disk.

Ubuntu的安装过程现在是越来越简单了, 过程也记不清了, 这里就不说了.  总之顺利安装成功.

Host 的IP是 192.168.82.81, Client的IP是192.168.206.129.

因为Company里有Security Audit, 所以需要通过Proxy才能上外网, 故第一步给Ubuntu设置代理服务器.

editor /etc/profile

添加:

http_proxy=http://192.168.88.80:3128
https_proxy=http://192.168.88.80:3128
ftp_proxy=http://192.168.88.80:3128
export http_proxy https_proxy ftp_proxy

然后Reboot.

OK, 可以上外网了. 现在开始更新apt源, 由于默认安装后的源是Ubuntu在国外的服务器, 非常慢, 所以先更改源地址:

editor /etc/apt/sources.list

然后在所有的archive.ubuntu.com前加上cn., 即: http://cn.archive.ubuntu.com/ubuntu/ , cn.archive.ubuntu.com 是由阿里巴巴维护的, 放在阿里云上, 速度是很快的.

下面开始 update source list:

atp-get update

下面开始安装VIM, 使用Editor编辑器实在不顺手:

apt-get install vim

下面开始安装LAMP:

tasksel install lamp-server

下面开始安装Nginx:

apt-get install nginx

下面开始安装phpMyAdmin:

apt-get install phpmyadmin

至此nginx+lamp+phpmyadmin安装结束. 现在要开始进行配置.

因为nginx会占用80端口, 所以apache将无法启动, 因为nginx是进行对外公布的load blancing, 所以nginx会占用80和443 两个端口. 所以先来修改apache的端口, 以及启用apache对于SSL的支持.

vim /etc/apache/prots.conf

将apache的监听http协议的端口改为8080, SSL协议的端口改为4433

NameVirtualHost *:8080
Listen 8080
NameVirtualHost *:4433

<IfModule mod_ssl.c>
Listen 4433
</IfModule>
<IfModule mod_gnutls.c>
Listen 4433
</IfModule>

然后切换目录到/etc/apache2/mods-enabled/

cd /etc/apache2/mods-enabled/

执行命令下面命令, 以启用apache对于SSL的支持:

ln -s ../mods-available/ssl.conf
ln -s ../mods-available/ssl.load

然后将apache自带的ssl站点进行启用:

cd /etc/apache2/sites-enabled/
ln -s ../sites-available/default-ssl

然后对000-default和default-ssl这2个virtual host进行端口更改:

vi /etc/apache2/sites-enabled/000-default
vi /etc/apache2/sites-enabled/default-ssl

将000-default中的VirtualHost *:80改为VirtualHost *:8080, 将default-ssl中的VirtualHost *:443改为VirtualHost *:4433

在Host上使用IE打开Http://192.168.206.129:8080和https://192.168.206.129:4433, 如果都可以打开, 说明apache的配置成功.

现在来配置nginx, 使其进行反向代理和负载均衡:

vi /etc/nginx/sites-enabled/default

需要分别配置http和https的load blancing, 其中192.168.82.81是Host上安装的IIS:

upstream loadblancing{
server 192.168.82.81:80;
server 127.0.0.1:8080;
}

upstream loadblancingssl{
server 192.168.82.81:443;
server 127.0.0.1:4433;
}

然后在server节点里, 将location节点修改为:

location /{
proxy_pass http://loadblancing;
}

然后定位到文件末页, 将关于Https Server的注释符号”#” 全拿掉, 使其启用.

并且将其location节点修改为:

location / {
https://loadblancingssl;
}

另外, 需要将ssl证书和key的位置进行修改, 在后面我们需要创建open ssl 证书:

ssl_certificate /root/server.crt;
ssl_certificate_key /root/server.key;

现在来创建openssl证书, 首先来创建私钥, 创建私钥的过程中会要求输入密码:

openssl
genrsa -aes256 -out server.key 1024

创完私钥, 来创建证书的请求文件:

openssl
req -new -key server.key -out server.csr

请求文件创建成功后, 我们来把私钥做个备份:

cp server.key server.key.bak

我们把带密码的key取消掉口令, 以便Nginx可以正常使用:

openssl
rsa -in server.key.bak -out server.key

然后我们使用x509来颁发证书, 得到证书文件server.crt :

openssl
x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

现在我们来重启Nginx:

/etc/init.d/nginx restart

OK, 结束. 现在可以在host上打开IE, 浏览http://192.168.206.129和https://192.168.206.129, 会发现相同的URL在点击刷新后, 不断出现不同的页面, 这是因为一个是Client上的Apache首页, 一个是Host上的IIS首页.

 

统计信息, SQLServer自动更新和自动创建统计信息选项

统计信息是如何提高SQLServer查询性能的?统计直方图用作在查询执行计划中查询优化器的选择依据。如果一个查询谓词包含统计信息的列,那么查询优 化器不需要预测该查询中影响行数,因此,查询优化器有足够的信息去创建执行计划。SQLServer创建执行计划有一下几种不同的方式:

  • 统计信息会在每个新创建的索引中自动创建统计信息。
  • 如果数据库中AUTO_CREATE_STATISTICS被设置为ON,SQLServer将会自动对查询中用到的,且没有索引的列自动创建统计信息。

AUTO_CREATE_STATISTICS选项:

当把该选项设为ON时,查询优化器会对在谓词中使用的到列,如果这些列的统计信息不可用,则会单独对每列创建统计信息。这些统计信息对创建一个查询 计划非常必要。它们创建于那些现有统计对象中不存在直方图的列上,名字包括列名和对象ID的十六进制格 式:_WA_Sys_<column_name>_<XXXX>。这些统计信息用于查询优化器决定使用何种优化后的执行计划。

可以通过以下语句启用自动统计信息创建功能:

ALTER  DATABASE[你的库名]

SET AUTO_CREATE_STATISTICS ON

Auto Update Statistics选项:

统计信息会在查询编译或者执行缓存执行计划前被检查。当在以下情况下,统计信息会被认为过期:

1、  在一个空表中有数据的改动。

2、  当统计信息创建时,表的行数只有500或以下,且后来统计对象中的引导列的更改次数大于500.

3、  当表的统计信息收集时,超过了500行,且统计对象的引导列后来更改次数超过500+表总行数的20%时。

4、  在Tempdb中的表,少于6行且最少有6行被更改。 Continue reading “统计信息, SQLServer自动更新和自动创建统计信息选项”

Asp.Net MVC温故而知新【14】- Details 和 Delete 方法详解

  1. Asp.Net MVC温故而知新【1】-添加控制器
  2. Asp.Net MVC温故而知新【2】-添加视图
  3. Asp.Net MVC温故而知新【3】- 修改视图和布局页
  4. Asp.Net MVC温故而知新【4】- 控制器传递数据给视图
  5. Asp.Net MVC温故而知新【5】- 添加模型
  6. Asp.Net MVC温故而知新【6】- 创建连接字符串
  7. Asp.Net MVC温故而知新【7】- 通过控制器访问模型的数据
  8. Asp.Net MVC温故而知新【8】- 生成的代码详解
  9. Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB
  10. Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解
  11. Asp.Net MVC温故而知新【11】- 添加查询
  12. Asp.Net MVC温故而知新【12】- 数据迁移之添加字段
  13. Asp.Net MVC温故而知新【13】- 添加验证
  14. Asp.Net MVC温故而知新【14】- Details 和 Delete 方法详解

下一个项目使用Asp.Net MVC技术进行开发,以前也用过,好几年没用了,今天没事便找了个教程,复习了一下,是Asp.Net MVC4框架,觉得浅显易懂,便复制收藏了。

在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法。

Details 方法

打开Movie控制器,找到Details方法。

//
// GET: /Movies/Details/5
public ActionResult Details(Int32 id)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Code First 通过使用Find方法找到要显示的Movie对象。如果movie对象为null,则返回HttpNotFound(),这个判断非常有必要,试想如果有黑客要攻击你的网站,他们可能将通过修改URL来尝试访问你的网站,例如将http://localhost:xxxx/Movies/Details/1 修改为http://localhost:xxxx/Movies/Details/12345 。如果你不去验证movie是否为空,则会将数据库错误返回给黑客,这样会暴漏网站的更多信息。

Delete 和 DeleteConfirm 方法

//
// GET: /Movies/Delete/5
public ActionResult Delete(Int32 id)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(Int32 id)
{
    Movie movie = db.Movies.Find(id);
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

第一个Delete方法并没有删除Movie,而是返回了可以删除确认页面,在确认页面中,会创建HttpPost请求,完成Movie的删除。直接使用HttpGet 请求来删除Movie会打开一个安全漏洞。

真正删除数据的方法名字是 DeleteConfirmed。下面是两个方法的定义:

public ActionResult Delete(Int32 id)

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(Int32 id)

CLR对于重构的方法,要求方法名相同,但参数不同。然而,我们在这里用到的两个删除方法,他们都接收一个整形的参数,如果方法名也形同,那么就构成语法错误了。

为了解决这个问题,有以下几种解决办法:

第一种办法是使用不同的方法名。这也是ASP.NET MVC 5 支架所采用的方法。然而,使用这种方法还有一些小问题:ASP.NET 通过地址段来映射方法名,如果将方法重命名,路由通常会找不到方法,解决的办法已经在上面的例子中了,我们可以为DeleteConfirmed方法添加特性ActionName(“Delete”)。这样一来,当URL中包含Delete 的POST请求都会被分配给方法DeleteConfirmed。

另外一种常用解决的方法是使用相同的名字,然后为POST 方法添加一个未使用的参数。例如,一些开发者会添加FormCollection类型的参数传递给POST方法,然后不使用这个参数:

public ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    db.Movies.Remove(movie);
    db.SaveChanges();
    return RedirectToAction("Index");
}

 

总结

现在你已经拥有了一个完整的ASP.NET MVC 5 应用程序,你可以使用LocalDB来存储数据,可以新建、编辑、查找、删除 Movie数据。

Asp.Net MVC温故而知新【13】- 添加验证

  1. Asp.Net MVC温故而知新【1】-添加控制器
  2. Asp.Net MVC温故而知新【2】-添加视图
  3. Asp.Net MVC温故而知新【3】- 修改视图和布局页
  4. Asp.Net MVC温故而知新【4】- 控制器传递数据给视图
  5. Asp.Net MVC温故而知新【5】- 添加模型
  6. Asp.Net MVC温故而知新【6】- 创建连接字符串
  7. Asp.Net MVC温故而知新【7】- 通过控制器访问模型的数据
  8. Asp.Net MVC温故而知新【8】- 生成的代码详解
  9. Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB
  10. Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解
  11. Asp.Net MVC温故而知新【11】- 添加查询
  12. Asp.Net MVC温故而知新【12】- 数据迁移之添加字段
  13. Asp.Net MVC温故而知新【13】- 添加验证
  14. Asp.Net MVC温故而知新【14】- Details 和 Delete 方法详解

下一个项目使用Asp.Net MVC技术进行开发,以前也用过,好几年没用了,今天没事便找了个教程,复习了一下,是Asp.Net MVC4框架,觉得浅显易懂,便复制收藏了。

在本节中,我们将为Movie模型添加验证逻辑,并确认验证规则在用户试图使用程序创建和编辑电影时有效。

DRY 原则

ASP.NET MVC 的一个核心原则是DRY(Don’t Repeat Yourself – 不做重复的事情)。ASP.NET MVC 鼓励你一次性的指定功能或行为,然后应用程序的其它地方通过映射得到它,这样一来就减少了大量的代码,从而减少了出错误的可能性,并且更易于维护。

ASP.NET MVC 和 Entity Framework Code First 提供的验证能是 DRY 原则的不错的实践。你可以在一处(在模型类中)定义验证规则,从而在应用程序中的所有地方都可以使用这个规则。

接下来让我们看看如何在现在的Movie 中添加高级的验证规则吧。

为模型添加验证规则

现在我们开始为Movie类添加一些验证规则。

打开文件 Movie.cs,注意命名空间 System.ComponentModel.DataAnnotations 并不包含 System.Web。DataAnnotations 提供了内置的验证特性,你可以将它们用在任何类或属性中(它还包含了像DataType这样的格式化的特性,它们不参与任何验证)。

为Movie类添加一些内置的验证规则,修改后的代码如下:

代码清单1:添加了验证规则的Movie类

public class Movie
{
    public int ID { get; set; }

    [Required]
    [StringLength(60, MinimumLength = 3)]
    public string Title { get; set; }

    [Display(Name = "Release Date")]
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }

    [Required]
    public string Genre { get; set; }

    [Range(1, 100)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }

    [StringLength(5)]
    [Required]
    public string Rating { get; set; }
}

使用数据迁移来更新数据库结构。编译解决方案,然后打开“程序包管理器控制台”窗口,执行下面的命令: Continue reading “Asp.Net MVC温故而知新【13】- 添加验证”

Asp.Net MVC温故而知新【12】- 数据迁移之添加字段

  1. Asp.Net MVC温故而知新【1】-添加控制器
  2. Asp.Net MVC温故而知新【2】-添加视图
  3. Asp.Net MVC温故而知新【3】- 修改视图和布局页
  4. Asp.Net MVC温故而知新【4】- 控制器传递数据给视图
  5. Asp.Net MVC温故而知新【5】- 添加模型
  6. Asp.Net MVC温故而知新【6】- 创建连接字符串
  7. Asp.Net MVC温故而知新【7】- 通过控制器访问模型的数据
  8. Asp.Net MVC温故而知新【8】- 生成的代码详解
  9. Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB
  10. Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解
  11. Asp.Net MVC温故而知新【11】- 添加查询
  12. Asp.Net MVC温故而知新【12】- 数据迁移之添加字段
  13. Asp.Net MVC温故而知新【13】- 添加验证
  14. Asp.Net MVC温故而知新【14】- Details 和 Delete 方法详解

下一个项目使用Asp.Net MVC技术进行开发,以前也用过,好几年没用了,今天没事便找了个教程,复习了一下,是Asp.Net MVC4框架,觉得浅显易懂,便复制收藏了。

在本节中,我们将使用Entity Framework Code First 数据迁移功能将模型类的改变应用到数据库中。

默认情况下,当我们使用Entity Framework Code First 自动创建一个数据库,像我们之前教程中讲的那样,Code First 添加一个table帮我们跟踪数据库结构是否与模型类同步。如果不同步,Entity Framework 将抛出一个错误,这样更方便我们在开发的时候发现问题,否则只能在运行时通过晦涩的错误来查找了。

为模型更改设置 Code First 数据迁移

在解决方案资源管理器中,删除自动创建的 Movies.mdf 文件。

在工具菜单中,选择“库程序包管理器”>“程序包管理器控制台”:

图1:打开“程序包管理器控制台”菜单项

image

在“程序包管理器控制台”窗口中输入:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext Continue reading “Asp.Net MVC温故而知新【12】- 数据迁移之添加字段”

Asp.Net MVC温故而知新【11】- 添加查询

  1. Asp.Net MVC温故而知新【1】-添加控制器
  2. Asp.Net MVC温故而知新【2】-添加视图
  3. Asp.Net MVC温故而知新【3】- 修改视图和布局页
  4. Asp.Net MVC温故而知新【4】- 控制器传递数据给视图
  5. Asp.Net MVC温故而知新【5】- 添加模型
  6. Asp.Net MVC温故而知新【6】- 创建连接字符串
  7. Asp.Net MVC温故而知新【7】- 通过控制器访问模型的数据
  8. Asp.Net MVC温故而知新【8】- 生成的代码详解
  9. Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB
  10. Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解
  11. Asp.Net MVC温故而知新【11】- 添加查询
  12. Asp.Net MVC温故而知新【12】- 数据迁移之添加字段
  13. Asp.Net MVC温故而知新【13】- 添加验证
  14. Asp.Net MVC温故而知新【14】- Details 和 Delete 方法详解

下一个项目使用Asp.Net MVC技术进行开发,以前也用过,好几年没用了,今天没事便找了个教程,复习了一下,是Asp.Net MVC4框架,觉得浅显易懂,便复制收藏了。

在本节中,我们为 Index 方法添加查询功能,使我们能够根据电影的题材或名称进行查找。

修改 Index 表单

Start by updating the Index action method to the existing MoviesController class. Here’s the code:

首先,我们需要更新 MoviesControllerIndex 方法,代码如下:

代码清单1:更新后的Index方法 – MoviesController.cs

public ActionResult Index(string searchString)
{
    var movies = from m in db.Movies
                 select m;

    if (!String.IsNullOrEmpty(searchString))
    {
        movies = movies.Where(s => s.Title.Contains(searchString));
    }

    return View(movies);
}

Index 方法的第一行代码创建了一个 LINQ 查询,用来选择符合条件的电影:

代码清单2:选择电影的LINQ查询

var movies = from m in db.Movies
             select m;

这个查询虽然在这里定义出来,但并没有在数据库中执行。

如果 searchString 参数包含一个字符串(不是空字符串),movies 查询将会添加一个查询字符串的过滤条件,代码如下: Continue reading “Asp.Net MVC温故而知新【11】- 添加查询”

Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解

  1. Asp.Net MVC温故而知新【1】-添加控制器
  2. Asp.Net MVC温故而知新【2】-添加视图
  3. Asp.Net MVC温故而知新【3】- 修改视图和布局页
  4. Asp.Net MVC温故而知新【4】- 控制器传递数据给视图
  5. Asp.Net MVC温故而知新【5】- 添加模型
  6. Asp.Net MVC温故而知新【6】- 创建连接字符串
  7. Asp.Net MVC温故而知新【7】- 通过控制器访问模型的数据
  8. Asp.Net MVC温故而知新【8】- 生成的代码详解
  9. Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB
  10. Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解
  11. Asp.Net MVC温故而知新【11】- 添加查询
  12. Asp.Net MVC温故而知新【12】- 数据迁移之添加字段
  13. Asp.Net MVC温故而知新【13】- 添加验证
  14. Asp.Net MVC温故而知新【14】- Details 和 Delete 方法详解

下一个项目使用Asp.Net MVC技术进行开发,以前也用过,好几年没用了,今天没事便找了个教程,复习了一下,是Asp.Net MVC4框架,觉得浅显易懂,便复制收藏了。

在本节中,我们继续研究生成的Edit方法和视图。但在研究之前,我们先将 release date 弄得好看一点。打开 ModelsMovie.cs 文件,添加下面黄色背景的行:

代码清单1:ModelsMovie.cs 文件

using System;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;

namespace MvcMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public string Title { get; set; }
        [Display(Name = "Release Date")]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }

    public class MovieDBContext : DbContext
    {
        public DbSet<Movie> Movies { get; set; }
    }
}

我们将在下一节中介绍 DataAnnotations。Display 特性指定了显示的字段名(本例中“Release Date”替换了“ReleaseDate”)。DataType 特性指定了数据类型,在本例中它是日期类型,因此存储在该字段的时间信息将不会显示出来。

运行应用程序,在浏览器地址栏中追加/movies 来访问 Movies 控制器。将鼠标放在Edit 链接上面,查看它链接到的地址: Continue reading “Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解”

Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB

  1. Asp.Net MVC温故而知新【1】-添加控制器
  2. Asp.Net MVC温故而知新【2】-添加视图
  3. Asp.Net MVC温故而知新【3】- 修改视图和布局页
  4. Asp.Net MVC温故而知新【4】- 控制器传递数据给视图
  5. Asp.Net MVC温故而知新【5】- 添加模型
  6. Asp.Net MVC温故而知新【6】- 创建连接字符串
  7. Asp.Net MVC温故而知新【7】- 通过控制器访问模型的数据
  8. Asp.Net MVC温故而知新【8】- 生成的代码详解
  9. Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB
  10. Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解
  11. Asp.Net MVC温故而知新【11】- 添加查询
  12. Asp.Net MVC温故而知新【12】- 数据迁移之添加字段
  13. Asp.Net MVC温故而知新【13】- 添加验证
  14. Asp.Net MVC温故而知新【14】- Details 和 Delete 方法详解

下一个项目使用Asp.Net MVC技术进行开发,以前也用过,好几年没用了,今天没事便找了个教程,复习了一下,是Asp.Net MVC4框架,觉得浅显易懂,便复制收藏了。

Entity Framework Code First 检查连接字符串使用的数据库是否存在,如果不存在,则会自动创建数据库文件。你可以在 App_Data 文件夹下查看数据库是否被创建(如果你没有看到Movies.mdf 文件,点击解决方案资源管理器工具栏上的“显示所有文件”按钮,单击“刷新”按钮,然后展开 App_Data 文件夹)。

图1:Movies.mdf 文件位置

image

Continue reading “Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB”

Asp.Net MVC温故而知新【8】- 生成的代码详解

  1. Asp.Net MVC温故而知新【1】-添加控制器
  2. Asp.Net MVC温故而知新【2】-添加视图
  3. Asp.Net MVC温故而知新【3】- 修改视图和布局页
  4. Asp.Net MVC温故而知新【4】- 控制器传递数据给视图
  5. Asp.Net MVC温故而知新【5】- 添加模型
  6. Asp.Net MVC温故而知新【6】- 创建连接字符串
  7. Asp.Net MVC温故而知新【7】- 通过控制器访问模型的数据
  8. Asp.Net MVC温故而知新【8】- 生成的代码详解
  9. Asp.Net MVC温故而知新【9】- 使用 SQL Server LocalDB
  10. Asp.Net MVC温故而知新【10】- Edit方法和Edit视图详解
  11. Asp.Net MVC温故而知新【11】- 添加查询
  12. Asp.Net MVC温故而知新【12】- 数据迁移之添加字段
  13. Asp.Net MVC温故而知新【13】- 添加验证
  14. Asp.Net MVC温故而知新【14】- Details 和 Delete 方法详解

下一个项目使用Asp.Net MVC技术进行开发,以前也用过,好几年没用了,今天没事便找了个教程,复习了一下,是Asp.Net MVC4框架,觉得浅显易懂,便复制收藏了。

打开文件 ControllersMoviesController,检查生成的 Index 方法。MoviesController 的包含Index 方法的部分代码如下:

代码清单1:MoviesController.cs

public class MoviesController : Controller
{
    private MovieDBContext db = new MovieDBContext();

    //
    // GET: /Movies/
    public ActionResult Index()
    {
        return View(db.Movie.ToList());
    }

MovieController 类中,包含了 MovieDBContext 类的实例,你可以使用它进行查询、编辑和删除电影。

MoviesControllerIndex 方法将返回所有数据库中的电影数据,然后将结果传递给 Index 视图。

强类型模型和@model关键字

在之前的章节中,我们已经介绍了如果使用 ViewBag 将数据从控制器传递给视图。ViewBag 是一个动态对象,提供了一个便捷的后期绑定的方式将数据传递给视图。

ASP.NET MVC 同样提供了传递强类型数据或对象到视图的功能。这种强类型的方式提供了更好的编译时检查和更丰富的智能感知,Visual Studio 中的脚手架机制在创建 MoviesController 类和视图的时候使用了这种方式。

检查 ControllersMoviesController.cs 文件中的 Details 方法,下面是Detais方法的部分代码:

代码清单2:Details 方法 – ControllersMoviesController.cs

public ActionResult Details(Int32 id)
{
    Movie movie = db.Movie.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

参数 id 通常会作为路由数据传递给控制器,例如 http://localhost:1234/movies/details/1 将会设置控制器为 MoviesController,操作为 Details,参数 id 为1。你还可以通过查询字符串传递 idhttp://localhost:1234/movies/details?id=1

如果找到了电影信息,一个电影的模型就会传递给Details视图。检查一下 ViewsMoviesDetails.cshtml 文件的内容。

通过文件顶部的@model 语句,你就知道这个视图所期望的什么类型的对象。当你创建了电影控制器,Visual Studio 将会自动在Details.cshtml 文件顶部包含如下语句:

代码清单3:@model语句 – Details.cshtml

@model MvcMovie.Models.Movie

@model 指令允许使用强类型 Model 对象访问从 Controller 传递给 View 的电影对象(注意,此时的Model对象是 Movie 类型)。例如,在Details.cshtml 模板中,代码将Movie的每一个字段通过强类型的 Model 对象传递给DisplayNameForDisplayFor HTML帮助方法。CreateEdit 方法也传递了一个Model给视图,此处不再多讲。

检查 Index.cshtml 模板和 MoviesController.cs 文件的 Index 方法,程序先创建好一个电影模型的列表对象,然后将创建好的列表对象通过View方法传递给视图:

代码清单4:Index 方法 – MoviesController.cs

public ActionResult Index()
{
    return View(db.Movie.ToList());
}

Visual Studio 自动在 Index.cshtml 文件顶部添加了@model 语句:

代码清单5:@model语句 – Index.cshtml

@model IEnumerable<MvcMovie.Models.Movie>

@model 指令允许使用强类型 Model 对象访问从 Controller 传递给 View 的电影列表对象(注意,此时的Model对象是 IEnumerable<Movie> 类型)。例如,在Index.cshtml模板中,代码通过foreach 语句循环强类型Model中的每个电影对象。

代码清单6:foreach 代码块 – Index.cshtml

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
        </td>
    </tr>
}

因为Model对象是强类型(IEnumerable<Movie>),每个循环中的 item 对象都是 Movie 类型的。这意味着你的代码具有更好的编译时检查和完整的智能感知支持: Continue reading “Asp.Net MVC温故而知新【8】- 生成的代码详解”