本文主要讲的内容是 Code First基础上的MVC 的起步基础操作。
关于MVC的中心:
- 建立一个Model Class
- 建立一个Scaffolding Item,生成一个MVC 5 View
- View 的模板有Create,Delete,Edit 等等
这次我们的工作是尝试起步使用一个MVC 例子,使用code first:
稍微熟悉一下 MVC的结构后,我们在Model里面新建一个item
- 命名为contact.cs
- 输入
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
报错,自动可以修改,会加入usingSystem.ComponentModel.DataAnnotations.Schema
; -
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
这个其实是设置自动增长属性
利用数据生成项 DatabaseGenerated,它后有三个枚举值: Identity:自增长;None:不处理;Computed:表示这一列是计算列
注意:在EF中,如果主键是int类型,Code First生成数据库的时候会自动设置该列为自增长。但如果主键是Guid类型,需要手动去设置
DATA Annotations 方式:[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- 写入
[Required]
这里也会报错,也是右击自动修改,在最前面生成了using System.ComponentModel.DataAnnotations;
-
[Required] OR [Required(ErrorMessage = "xxx")]
只是一个 Data Annotations 方式,表示非空 - 写入
[DisplayName]
报错右击自动加入using System.ComponentModel;
- 是可以创建自己写的annotation
public class MustBeTrueAttribute : ValidationAttribute
// MustBeTrueAttribute 是自己创建的,而ValidationAttribute 是.Net 本来就有的Attribute class
{
public override bool IsValid(object value)
{
return value is bool && (bool)value;
}
}
总结
System.ComponentModel.DataAnnotations Attributes
Attribute | Description |
---|---|
[DisplayName] |
显示名字 |
[Required] |
标注这个属性的字段,不能为空,确保其有数据 |
[MaxLength] |
给字段设定最大长度 |
System.ComponentModel.DataAnnotations.Schema Attributes:
Attribute | Description |
---|---|
[DatabaseGenerated] |
标注了这个特性的属性,将会映射成数据表的计算列字段,所以这个属性将会是只读的。它同样可以用来映射成自动增长列 |
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace Homework4.Models
{
public class Contact
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
[DisplayName("First Name")]
[MaxLength(20, ErrorMessage = "First name must be 20 characters or less.")]
public string FristName { get; set; }
[Required]
[DisplayName("Last Name")]
[MaxLength(20, ErrorMessage = "Last name must be 20 characters or less.")]
public string LastName { get; set; }
[Required]
[DisplayName("Email")]
[DataType(DataType.EmailAddress,ErrorMessage ="Email is not valid.")]
// 这个注释是允许 yyy@xx.cc这样的,所以我们选择自制
[Email]
// 只需要写Email
[MaxLength(20, ErrorMessage = "Email must be 20 characters or less.")]
public string Email { get; set; }
[DisplayName("Accept Terms and Conditions")]
[MustBeTrue]
public string AcceptTerms { get; set; }
}
public class MustBeTrueAttribute : ValidationAttribute
// MustBeTrueAttribute 是自己创建的,而ValidationAttribute 是.Net 本来就有的Attribute class
{
public override bool IsValid(object value)
{
return value is bool && (bool)value;
}
}
public class EmailAttribute : RegularExpressionAttribute
{
public EmailAttribute()
: base(@"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}")
{ }
}
}
该段内容相关链接:
Entity Framwork CodeFirst 学习笔记二:约定和配置
7.DataAnnotations(数据注解)【Code-First 系列】
接下来我们尝试一下做个scaffolding,也就是俗称的脚手架(下面有图)
- scaffolding 可以利用model来生成很多不同的内容,我们这里尝试生成一个View
- 首先把Home 里面的Contact.cshtml 删除掉
- 在做后面步骤之前,首先要先rebuild resolution
- 然后在model里add一个新的 scaffolded item
- 选择 MVC 5 View
- Create 就是生成新的内容
- Model Class 就选择Contact
- ApplicationDbContext
- 最后还要选择layout page
- 之后会生成一个 contact.cshtml (满是红波浪)
- 之前可能搞错了,把这个contact.cshtml 放回到View 文件夹里的home文件夹里
- 然后 直接build solution
- 单纯是这样的内容,还无法提交,原因是什么?
- 回到controllers文件夹中的HomeController.cs
// 这里只有GET ACTION,没有SUBMIT ACTION
[HttpPost]
public ActionResult Contact(Contact c)
{
// 检查modelstate valid,如果不是true,就把用户重返到当下的页面,如果是true,就返回thankyouview
if (!ModelState.IsValid)
{
return View(c);
}
return View("ThankYouView", c);
}
- 在view文件夹里的home文件夹中在add 新的thank you view
@{
ViewBag.Title = "View";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Thanks for contacting us!</h2>
网友评论