10、ASP.NET MVC入門到精通——Model(模型)和驗證


本系列目錄: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);
        }

效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM