本系列目錄:ASP.NET MVC4入門到精通系列目錄匯總
模型就是處理業務,想要保存、創建、更新、刪除的對象。
注解(通過特性實現)
- DisplayName
- Required
- StringLength(20,MinimumLength=2)
- DataType(System.ComponentModel.DataAnnotations.DataType.MultilineText)
- RegularExpression(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$",ErrorMessage="郵箱格式不對!")
.Net MVC請求處理流
請求→IIS→Runtime→Controller→Action → ViewResult(:ActionResult).ExcuteResult()→ RazorView(:IView).RenderView→Response
請求都歸結到Action上,所以是Url驅動
Action跟View是松耦合
所有的頁面繼承在viewpage類
View模板顯示頁面的規則:先找對於的Controller文件夾,再找對應的Shared文件夾
包括數據、驗證規則、數據訪問和業務邏輯等應用程序信息它是我們MVCWeb應用的主框架
Model調用的是我們的業務邏輯層
Model作為ViewModel使用的情況
Model是獨立的組件,不知道View和Controller的存在
MVC驗證
System.ComponentModel.DataAnnotations
定義驗證規則:
Model屬性添加內置驗證特性,介紹用的最多的其中的四個:
[Required], [StringLength], [Range], 和 [RegularExpression]
[StringLength(10,ErrorMessage="長度限制!")] public string LoginName { get; set; }
定義自己的定制驗證特性,然后應用它們。你可以通過繼承自System.ComponentModel.DataAnnotations命名空間中 的ValidationAttribute基類,定義完全定制的特性。
public class EmailAttribute : RegularExpressionAttribute
{
public EmailAttribute()
:base(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$")
{
}
}
Model
[Email] public string Email { get; set; }
View
<div>@Html.LabelFor(x=>x.Email):@Html.TextBoxFor(x=>x.Email)@Html.ValidationMessageFor(x=>x.Email)</div>
效果:
客戶端驗證
1.引入JS腳本支持
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
2.添加語句
@{Html.EnableClientValidation(true);}(MVC3+版本中默認開啟)
服務器端驗證
1.控制器中使用:ModelState.IsValid 判斷是否通過驗證
DataModel驗證
MetadataTypeAttribute Class
為數據實體的partial class添加額外的元數據驗證信息
使用步驟:
創建data-model partial class
創建關聯的metadata class.
將metadata class關聯到具體的數據實體類
使用的注意事項:
標簽只能打到一個類上
此標簽不能被繼承
使用示例:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace MvcApplication.Models
{
public class EmailAttribute : RegularExpressionAttribute
{
public EmailAttribute()
: base(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$")
{
}
}
[MetadataType(typeof(UserMetadata))]
public partial class User
{
public string UserName { get; set; }
public string Remark { get; set; }
public string Age { get; set; }
public string Pwd { get; set; }
public string RePwd { get; set; }
public string Email { get; set; }
}
//1.為實體類添加特性DisplayName
public class UserMetadata
{
[DisplayName("用戶名")]
[Remote("NotExitesDdata", "Home")]
public string UserName { get; set; }
/// <summary>
/// 1.在實體類中為Remark屬性設置DataType特性,指定為多行文本框
/// </summary>
[DataType(DataType.MultilineText)]
[DisplayName("備注")]
public string Remark { get; set; }
[DisplayName("年齡")]
[Range(1,120)]
public int Age { get; set; }
[PasswordPropertyText]
[DisplayName("密碼")]
public string Pwd { get; set; }
[PasswordPropertyText]
[DisplayName("重輸密碼")]
[System.Web.Mvc.Compare("Pwd")]
public string RePwd { get; set; }
[Email]
public string Email { get; set; }
}
}
另外提到一點,模型里面我在用戶名屬性上面添加了一個Remote特性,這個是一個異步調用的屬性,可以指定觸發某個action,返回值為bool(true or false),比如注冊用戶時,可用於驗證用戶名是否存在。
Controller
public JsonResult NotExitesDdata() { string UserName = Request.Params["UserName"]; return UserName == "123" ? Json(true,JsonRequestBehavior.AllowGet) : Json(false,JsonRequestBehavior.AllowGet); }
效果: