1. 程式人生 > 實用技巧 >學習MVC專案在7天-第三天

學習MVC專案在7天-第三天

介紹 我們假定你在來這裡前幾天已經讀過了。在第2天,我們完成了一個專案,這個專案有一個員工列表的網格。 在第三天,我們將把它帶到下一個層次,通過介紹資料訪問層和資料輸入螢幕。 完整的系列 第1天第2天第3天第4天第5天第6天7天獎金第1天獎金第2天 我們很高興地宣佈,這篇文章現在可以從www.amazon.com和www.flipkart.com獲得同樣的紙質書 議程 資料訪問層 簡單地說,實體框架是什麼? 什麼是程式碼優先方法? 實驗8 -在專案中增加資料訪問層 關於實驗八的演講 組織的一切 實驗9 -建立資料輸入螢幕 關於實驗九的演講 實驗室10 -在伺服器端/控制器中獲取釋出的資料 關於第十實驗室的演講 實驗11 -重置和取消按鈕 關於實驗室11的演講 實驗12 -在資料庫中儲存記錄並更新網格 實驗13 -增加伺服器端驗證 模型繫結器如何與原始資料型別一起工作 模型繫結器如何與類一起工作 在第13實驗室演講 實驗14 -自定義伺服器端驗證 結論 資料訪問層 沒有資料庫的實時專案是不完整的。在我們的專案中,我們還沒有談到資料庫層。第三天的第一個實驗將是關於資料庫和資料庫層。 這裡我們將分別使用Sql Server和Entity Framework來建立資料庫和資料庫訪問層。 簡單地說,實體框架是什麼? 這是一個ORM工具。ORM代表物件關係對映。 在RDBMS中,我們用表和列來表示,而在。net中(一個面向物件的世界),我們用類、物件和屬性來表示。 當我們考慮任何資料驅動的應用程式時,我們會得到以下兩件事。 編寫用於與資料庫通訊的程式碼(稱為資料訪問層或資料庫邏輯)編寫用於對映資料庫資料到面向物件資料的程式碼,反之亦然。 ORM工具可以自動完成這兩件事。實體框架是微軟ORM工具。 什麼是程式碼優先方法? 在實體框架中,我們可以採用這三種方法中的一種 資料庫優先方法——建立包含表、列、關係等的資料庫,實體框架將生成相應的模型類(業務實體)和資料訪問層程式碼。模型優先方法——在這種方法中,模型類和它們之間的關係將使用Visual studio中的模型設計器手工定義,實體框架將自動生成資料訪問層和具有表、列、關係的資料庫。程式碼優先方法——在這種方法中,將手動建立POCO類。這些類之間的關係將通過程式碼來定義。當應用程式第一次執行時,實體框架將在資料庫伺服器中自動生成資料訪問層和資料庫以及表、列和關係。 什麼是POCO類? POCO代表“普通的舊CLR物件”。POCO類意味著我們建立的簡單的。net類。在前面的示例中,Employee類只是一個POCO類。 實驗8 -在專案中增加資料訪問層 步驟1 -建立資料庫 連線到Sql伺服器並建立名為“SalesERPDB”的新資料庫。 步驟2 -建立ConnectionString 開放網路。配置檔案和內部配置部分新增以下部分 隱藏,複製Code

<connectionStrings>
<add connectionString="Data Source=(local);Initial Catalog=SalesERPDB;Integrated Security=True"
        name="SalesERPDAL"       
        providerName="System.Data.SqlClient"/>
</connectionStrings>

步驟3 -新增實體框架引用 右鍵點選專案>>Nuget包管理。搜尋實體框架並單擊install。 步驟4 -建立資料訪問層。 在根資料夾中建立一個名為“DataAccessLayer”的新資料夾,並在其中建立一個名為“SalesERPDAL”的新類,在頂部放置using語句,如下所示。 隱藏,使用System.Data.Entity複製程式碼; 從DbContext繼承“SalesERPDAL” 隱藏,複製Code

public class SalesERPDAL: DbContext
{
}

步驟5 -為employee類建立主鍵欄位 開啟Employee類並在下面的topas處放置using語句。 隱藏,複製Code

using System.ComponentModel.DataAnnotations;

在Employee類中新增EmployeeId屬性並將其標記為鍵屬性。 隱藏,複製Code

public class Employee
{
    [Key]
    public int EmployeeId  { get; set; }
    public string FirstName { get
; set; } public string LastName { get; set; } public int Salary { get; set; } }

步驟6 -定義對映 將下面的using語句放在“SalesERPDAL”類的頂部 隱藏,複製Code

using WebApplication1.Models;

重寫SalesERPDAL類中的onmodelcreate方法,如下所示。 隱藏,複製Code

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<employee>().ToTable("TblEmployee");
    base.OnModelCreating(modelBuilder);
}
</employee>

注意:在上面的程式碼片段中,“TblEmployee”表示表名。它會在執行時自動建立。 步驟7 -建立屬性以在資料庫中儲存僱員 在“SalesERPDAL”類中建立一個名為Employee的新屬性,如下所示 隱藏,複製Code

public DbSet<employee> Employees{get;set;}
</employee>

DbSet將表示可以從資料庫查詢的所有員工。 步驟8 -更改業務層程式碼並從資料庫中獲取資料 開啟EmployeeBusinessLayer類。將using語句放在頂部。 隱藏,複製Code

using WebApplication1.DataAccessLayer;

現在更改GetEmployees方法類如下。 隱藏,複製Code

public List<employee> GetEmployees()
{
    SalesERPDAL salesDal = new SalesERPDAL();
    return salesDal.Employees.ToList();
}
</employee>

步驟9 -執行和測試 按F5並執行應用程式。 現在我們d資料庫中沒有任何僱員,因此我們將看到一個空白的網格。 檢查資料庫。現在我們有一個名為TblEmployee的表,包含所有列。 步驟9 -插入測試資料 向TblEmployee表新增一些虛擬資料。 步驟10 -執行並測試應用程式 按F5再次執行應用程式。 開始吧:) 關於實驗八的演講 DbSet是什麼? DbSet只是表示可以從資料庫查詢的所有實體的集合。當我們編寫一個Linq查詢DbSet物件時,它在內部轉換為查詢並針對資料庫觸發。 在我們的例子中,“Employees”是一個DbSet,它包含所有可以從資料庫查詢的“Employee”實體。每次我們嘗試訪問“Employees”時,它都會獲取“TblEmployee”表中的所有記錄,並將其轉換為“Employee”物件並返回集合。 連線字串和資料訪問層是如何連線的? 對映將根據名稱進行。在我們的示例中,ConnectionString名稱和資料訪問層類名稱與“SalesERPDAL”相同,因此會自動對映。 我們可以改變ConnectionString的名字嗎? 是的,在這種情況下,我們必須在資料訪問層類中定義一個建構函式,如下所示。 隱藏,複製Code

public SalesERPDAL():base("NewName")
{
}

組織的一切 為了讓每件事都有條理和意義,讓我們做一些改變。 第一步-重新命名 getview操作方法將測試資料夾(在Views資料夾內)索引為employee,將“MyView”檢視索引為“Index” 步驟2 -從EmployeeListViewModel中刪除使用者名稱屬性 步驟3 -從檢視中刪除使用者名稱 檢視/ Employee.Index開放。cshtml檢視並從其中刪除使用者名稱。 簡單地說,刪除下面的程式碼塊。 隱藏,複製Code

 Hello @Model.UserName
<hr />

步驟2 -改變員工控制員的索引操作方法 因此,將EmployeeController中的索引操作中的程式碼更改如下。 隱藏,複製Code

public ActionResult Index()
{
 ……
 ……
 ……
    employeeListViewModel.Employees = empViewModels;
    //employeeListViewModel.UserName = "Admin";-->Remove this line -->Change1
    return View("Index", employeeListViewModel);//-->Change View Name -->Change 2
}

現在執行時URL將會“…/Employee/Index” 實驗9 -建立資料輸入螢幕 步驟1 -建立行動方法 在EmployeeController中建立一個名為“AddNew”的操作方法,如下所示 隱藏,複製Code

public ActionResult AddNew()
{
 return View("CreateEmployee");
}

步驟2 -建立檢視 在view /Employee資料夾中建立一個名為“CreateEmployee”的檢視,如下所示。 隱藏,複製Code

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
    <head>
      <meta name="viewport" content="width=device-width" />
      <title>CreateEmployee</title>
    </head>
    <body>
      <div>
         <form action="/Employee/SaveEmployee" method="post">
            First Name: <input type="text" id="TxtFName" name="FirstName" value="" /><br />
            Last Name: <input type="text" id="TxtLName" name="LastName" value="" /><br />
            Salary: <input type="text" id="TxtSalary" name="Salary" value="" /><br />
            <input type="submit" name="BtnSave" value="Save Employee" />
            <input type="button" name="BtnReset" value="Reset" />
         </form>
      </div>
    </body>
</html>

步驟3 -在索引檢視中建立一個連結 開放指數。新增一個指向AddNew動作URL的超連結。 隱藏,複製Code

<ahref="/Employee/AddNew">Add New</a>

步驟4 -執行並測試應用程式 按F5並執行應用程式 關於實驗九的演講 表格標籤的目的是什麼? 在本系列的第一天,我們瞭解到“Web世界不會遵循事件驅動程式設計模型”。它遵循請求-響應模型。終端使用者發出請求,伺服器傳送響應。表單標籤是在HTML中發出請求的一種方式。一旦表單標籤內的submit按鈕被單擊,一個請求將被髮送到action屬性中指定的URL。 什麼是表單標籤中的方法屬性? 它決定請求的型別。請求可以是以下四種類型之一——get、post、put和delete。 按照網路標準,我們應該使用- ——比;當我們想要得到某物時。當我們想要創造一些東西時,放上->當我們想要更新一些東西,刪除->當我們想要刪除一些東西時。 使用表單標籤發出請求與通過瀏覽器位址列或超連結發出請求有何不同? 當在表單標記的幫助下發出請求時,所有輸入控制元件的值將隨請求一起傳送以進行處理。 那麼複選框、單選按鈕和下拉選單呢?此控制元件的值也將傳送嗎? 是的,所有的輸入控制元件(input type=text, type=單選,type=複選框)和下拉選單(表示為“Select”元素)。 值將如何傳送到伺服器? 當請求的型別為Get、Put或Delete時,值將作為查詢字串引數傳送。 當它是post請求時,值將作為post資料傳送。 名稱屬性在輸入控制元件中的用途是什麼? 如前所述,當單擊submit按鈕時,所有輸入控制元件的值將隨請求一起傳送。它使伺服器一次接收多個值。為了在傳送時分別區分每個值,每個值都附加一個鍵,這個鍵將是簡單的“name”屬性。 名稱和id屬性用於相同的目的嗎? 不,根據上一個問題,“name”屬性會被HTML內部使用,當請求被髮送,而“id”屬性會被JavaScript內部的開發人員用於一些動態的東西。 “輸入型別=提交”和“輸入型別=按鈕”有什麼區別? Submit按鈕將在我們想要向伺服器發出請求時特別使用,而simple按鈕將用於執行一些定製的客戶端操作。簡單按鈕自己不會做任何事情。 實驗室10 -在伺服器端/控制器中獲取釋出的資料 步驟1 -建立SaveEmployee操作方法 在Employee控制器內部建立一個名為SaveEmployee的操作方法,如下所示。 隱藏所在sp;複製Code

public string SaveEmployee(Employee e)
{
   return e.FirstName + "|"+ e.LastName+"|"+e.Salary;
}

步驟2 -執行和測試 按F5並執行應用程式。 關於第十實驗室的演講 文字框的值是如何更新員工物件內部的動作方法? 在Asp。有一個概念叫做模型繫結器。 當對包含引數的動作方法發出請求時,模型繫結器將自動執行。模型繫結器將遍歷方法的所有基本引數,然後將引數的名稱與傳入資料中的每個鍵進行比較(傳入資料意味著釋出的資料或查詢字串)。當找到匹配時,相應的傳入資料將被分配給引數。在此之後,模型繫結器將遍歷每個類引數的每個屬性,並將每個屬性名稱與傳入資料中的每個鍵進行比較。當找到匹配時,相應的傳入值將被分配給引數。 如果指定了兩個引數,一個是“僱員e”,另一個是“字串FirstName”,會發生什麼? FirstName將在原始FirstName變數和e中被更新。FirstName財產。 模型繫結與組合關係工作嗎? 可以,但是在這種情況下,應該相應地給出控制元件的名稱。 例子 假設我們有如下Customer類和Address類 隱藏,複製Code

public class Customer
{
	public string FName{get;set;}
    public Address address{get;set;}
}
public class Address
{
	public string CityName{get;set;}
	public string StateName{get;set;}
}

在這種情況下,Html應該是這樣的 隱藏,複製Code

...
...
...
<input type="text" name="FName">
<input type="text" name="address.CityName">
<input type="text" name="address.StateName">
...
...
...

實驗11 -重置和取消按鈕 步驟1 -啟動重置和取消按鈕 新增一個重置和取消按鈕,如下所示 隱藏,複製程式碼… … … <input type="submit" name="BtnSubmit" value="Save Employee" /> <input type="button" name="BtnReset" value="Reset" onclick="ResetForm();"/比; <input type="submit" name="BtnSubmit" value="Cancel" /> 注意:儲存按鈕和取消按鈕的“Name”屬性值相同,即“BtnSubmit”。 步驟2 -定義ResetForm函式 在Html的標題部分新增一個指令碼標記,並在其中建立一個JavaScript函式ResetForm,如下所示。 隱藏,複製Code

<script>
    function ResetForm() {
        document.getElementById('TxtFName').value = "";
        document.getElementById('TxtLName').value = "";
        document.getElementById('TxtSalary').value = "";
    }
</script>

步驟3 -在EmplyeeController的SaveEmployee操作方法中實現取消點選。 將SaveEmployee操作方法更改如下 隱藏,複製Code

public ActionResult SaveEmployee(Employee e, string BtnSubmit)
{
 switch (BtnSubmit)
 {
 case "Save Employee":
 return Content(e.FirstName + "|" + e.LastName + "|" + e.Salary);
 case "Cancel":
 return RedirectToAction("Index");
 }
 return new EmptyResult();
}

步驟4 -執行應用程式。 按F5並執行應用程式。通過點選“新增新”連結導航到“新增新”螢幕。 步驟5 -測試重置功能 步驟6 -測試儲存和取消功能 關於實驗室11的演講 為什麼儲存和取消按鈕都有相同的名稱? 我們知道,一旦單擊submit按鈕,就會向伺服器傳送請求。所有輸入控制元件的請求值都將被髮送。 提交按鈕也是一個輸入按鈕。因此,submit按鈕(負責請求)的值也將被髮送。 當點選Save按鈕時,將傳送Save按鈕的值,即Save Employee,當點選Cancel按鈕時,將傳送Cancel按鈕的值,即Cancel,即Cancel。 在動作方法中,模型繫結器將完成剩餘的工作。它將用輸入資料中的值更新引數值(隨請求一起來) 實現多個提交按鈕的其他方法是什麼? 有很多方法。我想討論其中的三個。 1. 隱藏的表單元素 步驟1 -在檢視中建立一個隱藏的表單元素,如下所示。 隱藏,複製Code

<form action="/Employee/CancelSave" id="CancelForm" method="get" style="display:none">

</form>

<form action="/Employee/CancelSave" id="CancelForm"方法="get" style="display:none"> </form> 第2步-將提交按鈕改為普通按鈕,用JavaScript將上面的表單釋出出來。 隱藏,複製Code

<input type="button" name="BtnSubmit" value="Cancel" onclick="document.getElementById('CancelForm').submit()" />

2. 使用JavaScript動態更改動作URL 隱藏,複製Code

<form action="" method="post" id="EmployeeForm" >
...
...
<input type="submit" name="BtnSubmit" value="Save Employee" onclick="document.getElementById('EmployeeForm').action = '/Employee/SaveEmployee'" />
...
<input type="submit" name="BtnSubmit" value="Cancel" onclick="document.getElementById('EmployeeForm').action = '/Employee/CancelSave'" />
</form>

3.Ajax 而不是提交按鈕使用簡單的輸入按鈕和單擊它使純Ajax請求使用jQuery或任何其他庫。 為什麼我們沒有使用input type=reset來實現reset功能? Input type=reset控制元件不會清除值,它只是將值設定為控制元件的預設值。例子: 隱藏,複製Code

<input type="text" name="FName" value="Sukesh">

在上面的例子中,控制的預設值是“Sukesh”。 如果我們使用input type=reset來實現reset功能,那麼預設情況下“Sukesh”將會在文字框中設定每次“reset”按鈕被點選。 如果名稱與類的屬性名稱不匹配怎麼辦? 這是面試中很常見的問題。 假設我們有如下的HTML 隱藏,複製Code

First Name: <input type="text" id="TxtFName" name="FName" value="" /><br />
Last Name: <input type="text" id="TxtLName" name="LName" value="" /><br />
Salary: <input type="text" id="TxtSalary" name="Salary" value="" /><br />

現在,我們的模型類包含屬性名,如FirstName、LastName和Salary。因此,預設的模型繫結器在這裡不起作用。 在這種情況下,我們有以下三個解決方案 在action方法內部,使用Request檢索已傳送的值。表單語法和手動構造模型物件,如下所示。 隱藏,複製Code

public ActionResult SaveEmployee()
{
 Employee e = new Employee();
 e.FirstName = Request.Form["FName"];
 e.LastName = Request.Form["LName"];
 e.Salary = int.Parse(Request.Form["Salary"])
...
...
}

使用引數名稱並按如下方式手動建立模型物件。 隱藏,複製Code

public ActionResult SaveEmployee(string FName, string LName, int Salary)
{
 Employee e = new Employee();
 e.FirstName = FName;
 e.LastName = LName;
 e.Salary = Salary;
...
...
}

建立自定義模型繫結並替換預設模型繫結,如下所示。 步驟1 -建立自定義模型繫結器 藏e,複製Code

public class MyEmployeeModelBinder : DefaultModelBinder
{
 protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
 {
 Employee e = new Employee();
 e.FirstName = controllerContext.RequestContext.HttpContext.Request.Form["FName"];
 e.LastName = controllerContext.RequestContext.HttpContext.Request.Form["LName"];
 e.Salary = int.Parse(controllerContext.RequestContext.HttpContext.Request.Form["Salary"]);
 return e;
 }
}

步驟2-用這個新的模型繫結替換預設的模型繫結 隱藏,複製Code

public ActionResult SaveEmployee([ModelBinder(typeof(MyEmployeeModelBinder))]Employee e, string BtnSubmit)
{
	......

RedirecttToFunction做什麼? 就像ViewResult和ContentResult(第1天討論的)一樣,RedirectToRouteResult是ActionResult的子元素。它表示重定向響應。當瀏覽器接收到RedirectToRouteResult時,它會向新的動作方法發出新的請求。 注意:這裡瀏覽器負責新請求,因此URL將被更新為新URL。 EmptyResult是什麼? 又一個孩子的行動的結果。當瀏覽器接收到EmptyResult作為響應時,它只會顯示空白的螢幕。它只是表示“沒有結果”。 在我們的例子中,這種情況不會發生。只是為了確保所有的程式碼路徑都返回寫好的value EmptyResult語句。 注意:當ActionMethod返回型別為Void時,它等價於EmptyResult 實驗12 -在資料庫中儲存記錄並更新網格 步驟1 -在EmployeeBusinessLayer中建立SaveEmployee,如下所示 隱藏,複製Code

public Employee SaveEmployee(Employee e)
{
 SalesERPDAL salesDal = new SalesERPDAL();
 salesDal.Employees.Add(e);
 salesDal.SaveChanges();
 return e;
}

步驟2 -更改SaveEmployee操作方法 在EmployeeController中更改SaveEmployee操作方法程式碼,如下所示。 隱藏,複製Code

public ActionResult SaveEmployee(Employee e, string BtnSubmit)
{
 switch (BtnSubmit)
 {
 case "Save Employee":
 EmployeeBusinessLayer empBal = new EmployeeBusinessLayer();
 empBal.SaveEmployee(e);
 return RedirectToAction("Index");
 case "Cancel":
 return RedirectToAction("Index");
 }
 return new EmptyResult();
}

步驟3 -執行和測試 按F5並執行應用程式。導航到資料輸入螢幕並放置一些有效值。 實驗13 -增加伺服器端驗證 在實驗10中,我們已經看到了模型繫結器的基本功能。讓我們再多瞭解一點。 模型繫結器使用釋出的資料更新Employee物件。但是這並不是模型繫結執行的唯一功能。模型繫結器還會更新ModelState。ModelState封裝了模型的狀態。 它有一個名為IsValid的屬性,用於確定模型(即Employee物件)是否被成功更新。如果任何伺服器端驗證失敗,模型將不會更新。它儲存驗證錯誤。 例如:狀態(“FirstName”)。錯誤將包含與名字相關的所有錯誤它持有傳入值(釋出資料或查詢字串資料)它持有傳入值(釋出資料或查詢字串資料) 在Asp.net MVC中,我們使用DataAnnotations來執行伺服器端驗證。 在我們進入資料註釋之前,讓我們先了解一些關於模型繫結器的事情 模型繫結器如何與原始資料型別一起工作 當Action方法包含基本型別引數時,模型繫結器將把引數的名稱與傳入資料中的每個鍵進行比較(傳入資料意味著釋出的資料或查詢字串)。 當找到匹配時,相應的傳入資料將被分配給引數。當沒有找到匹配項時,引數將被指定為預設值。(預設值-對於整數是0(零),對於字串是null,等等)如果分配是不可能的,因為資料型別不匹配異常將被丟擲。 模型繫結器如何與類一起工作 當parameter是類引數時,模型繫結器將遍歷所有類的所有屬性,並將每個屬性名稱與傳入資料中的每個鍵進行比較。 當找到匹配時, 如果相應的傳入值為空,則 屬性將被賦空值。如果不可能賦空值,將設定預設值和ModelState。IsValid將被設定為false。如果null賦值是可能的,但將被視為無效值,因為驗證附加到屬性,然後null被分配為值和ModelState。IsValid將被設定為false。 如果相應的傳入值非空, 如果由於資料型別不匹配或伺服器端驗證失敗而無法分配,則將分配空值和ModelState。IsValid將被設定為false。 如果不可能賦空值,則設定預設值 當沒有找到匹配項時,引數將被指定為預設值。(預設值——對於整數它是0(零),對於字串它是null,等等)在這種情況下ModelState。“有效”將不受影響。 讓我們通過向我們正在進行的專案中新增驗證特性來理解這一點。 步驟1 -用DataAnnotations裝飾屬性 從模型資料夾中開啟Employee類,並使用DataAnnotation屬性修飾FirstName和LastName屬性,如下所示。 隱藏,複製Code

public class Employee
{
...
...
 [Required(ErrorMessage="Enter First Name")]
 public string FirstName { get; set; }

 [StringLength(5,ErrorMessage="Last Name length should not be greater than 5")]
 public string LastName { get; set; }
...
...
}

步驟2 -更改SaveEmployee操作方法 開啟EmplyeeController並更改SaveEmployee操作方法,如下所示。 隱藏,複製Code

public ActionResult SaveEmployee(Employee e, string BtnSubmit)
{
 switch (BtnSubmit)
 {
 case "Save Employee":
 if (ModelState.IsValid)
 {
 EmployeeBusinessLayer empBal = new EmployeeBusinessLayer();
 empBal.SaveEmployee(e);
 return RedirectToAction("Index");
 }
 else
 {
 return View("CreateEmployee ");
 }
 case "Cancel":
 return RedirectToAction("Index");
 }
 return new EmptyResult();
}

注意:正如您所看到的,當ModelState。IsValid是錯誤的響應SaveEmployee按鈕點選是ViewResult指向“CreateEmployee”檢視。 步驟3 -在檢視中顯示錯誤 更改“Views/Index/CreateEmployee”中的HTML。cshtml”之後。 這一次我們將格式化我們的UI與“表格”標籤的幫助; 隱藏,收縮,複製Code

<table>
   <tr>
      <td>
         First Name:
      </td>
      <td>
         <input type="text" id="TxtFName" name="FirstName" value="" />
      </td>
   </tr>
   <tr>
      <td colspan="2" align="right">
        @Html.ValidationMessage("FirstName")
      </td>
   </tr>
   <tr>
      <td>
        Last Name:
      </td>
      <td>
         <input type="text" id="TxtLName" name="LastName" value="" />
      </td>
   </tr>
   <tr>
      <td colspan="2" align="right">
         @Html.ValidationMessage("LastName")
      </td>
   </tr>

   <tr>
      <td>
        Salary:
      </td>
      <td>
         <input type="text" id="TxtSalary" name="Salary" value="" />
      </td>
   </tr>
   <tr>
      <td colspan="2" align="right">
        @Html.ValidationMessage("Salary")
      </td>
   </tr>

   <tr>
      <td colspan="2">
         <input type="submit" name="BtnSubmit" value="Save Employee" />
         <input type="submit" name="BtnSubmit" value="Cancel" />
         <input type="button" name="BtnReset" value="Reset" onclick="ResetForm();" />
      </td>
   </tr>
</table>

步驟4 -執行和測試 按F5並執行應用程式。導航到“Employee/AddNew”操作方法並測試應用程式。 測試1 測試2 注意:您可能會出現以下錯誤。 “模型backi自從建立資料庫以來,'SalesERPDAL'上下文已經發生了變化。考慮使用程式碼優先遷移來更新資料庫。” 要刪除此錯誤,只需在全域性中的Application_Start中新增以下語句。asax檔案。 隱藏,CodeDatabase副本。SetInitializer(新DropCreateDatabaseIfModelChanges< SalesERPDAL> ()); 資料庫類存在於System.Data內部。實體名稱空間 如果您仍然得到相同的錯誤,然後在Sql server中開啟資料庫並刪除剩餘的migrationhistory表。 很快我將釋出一個關於實體框架的新系列,在這裡我們將一步一步地學習實體框架。本系列旨在使用MVC模式,我們正努力堅持使用它。 在第13實驗室演講 什麼@Html。ValidationMessage做什麼? 意思是它是一個剃刀程式碼html是一個例項HtmlHelper類在檢視內部可用。validationmessage是HtmlHelper類的一個函式,它顯示錯誤訊息 ValidationMessage函式是如何工作的? ValidationMessage是一個函式。它在執行時執行。如前所述,ModelBinder更新ModelState。ValidationMessage顯示來自ModelState的基於鍵的錯誤訊息。 示例:ValidationMessage(“FirstName”)顯示與名字相關的錯誤訊息。 我們是否有更多的屬性,如required和StringLength? 有,這裡有一些 資料型別-確保資料是特定的型別,如電子郵件,信用卡號碼,網址等。enumdatatypeattribu—確保該值存在於列舉中。Range屬性-確保值在一個特定的範圍內。正則表示式——根據特定的正則表示式驗證值。Required——確保提供了該值。StringthLength—驗證字串的最大和最小字元數。 工資是如何被確認的? 我們沒有新增任何資料註釋屬性到工資屬性,但它仍然得到驗證。原因是,模型繫結器在更新模型時還考慮屬性的資料型別。 在測試1中-我們將薪金保留為空字串。在這種情況下,根據我們的模型繫結解釋(在實驗13中),ModelState。IsVaid將為false, ModelState將保留與將在檢視中顯示的薪水相關的驗證錯誤,因為Html.ValidationMessage(" Salary ") 在測試2 -工資資料型別不匹配,因此驗證失敗。 這是否意味著,整數屬性在預設情況下是強制性的? 是的,不僅是整數,而且是所有的值型別,因為它們不能容納空值。 如果我們想要一個非必需的整數字段呢? 可以為空嗎? 隱藏,複製Code

public int? Salary{get;set;}

如何更改為工資指定的驗證訊息? 對Salary的預設驗證支援(因為int資料型別)不允許我們更改驗證訊息。我們通過使用自己的驗證(如正則表示式、範圍或自定義驗證器)來實現同樣的效果。 為什麼值在驗證失敗時被清除? 因為這是一個新請求。從開發的角度來看,在開始時呈現的資料條目檢視和後來呈現的資料條目檢視是相同的,但是從請求的角度來看是不同的。我們將在第4天學習如何保持價值。 我們可以顯式地要求模型繫結器執行嗎? 是的,只是從動作方法中刪除引數。它會在預設情況下停止執行預設的模型繫結。 在本例中,我們可以使用UpdateModel函式,如下所示。 隱藏,複製Code

Employee e = new Employee();
UpdateModel<employee>(e);
</employee>

注意:UpdateModel不適用於原始資料型別。 UpdateModel和TryUpdateModel方法有什麼區別? TryUpdateModel將與UpdateModel相同,除了一個額外的優點。 如果由於任何原因導致模型適應失敗,UpdateModel將丟擲一個異常。對於UpdateModel函式ModelState。有效將沒有任何用處。 TryUpdateModel與將Employee物件作為函式引數完全相同。如果更新失敗ModelState。IsValid將為false; 那麼客戶端驗證呢? 除非使用HTML Helper類,否則應該手動完成。 在第4天,我們將在HTML helper類的幫助下討論手工客戶端驗證和自動客戶端驗證。 我們可以將多個DataAnnotation屬性附加到同一屬性嗎? 是的,我們可以。在這種情況下,兩個驗證都將觸發。 實驗14 -自定義伺服器端驗證 步驟1 -建立自定義驗證 開啟Employee.cs檔案並在其中建立一個名為FirstNameValidation的新類,如下所示。 隱藏,複製Code

public class FirstNameValidation:ValidationAttribute
{
 protected override ValidationResult IsValid(object value, ValidationContext validationContext)
 {
 if (value == null) // Checking for Empty Value
 {
 return new ValidationResult("Please Provide First Name");
 }
 else
 {
 if (value.ToString().Contains("@"))
 {
 return new ValidationResult("First Name should Not contain @");
 }
 }
 return ValidationResult.Success;
 }
}

注意:在一個檔案中建立多個類絕不是好的做法。因此,在您的示例中,我建議您在根位置建立一個名為“Validations”的新資料夾,並在其中建立一個新類。 步驟2-附加到名字 開啟Employee類並從FirstName屬性中刪除預設的“Required”屬性,並附加FirstNameValidation,如下所示。 隱藏,複製Code

[FirstNameValidation]
public string FirstName { get; set; }

步驟3 -執行和測試 按F5。導航到“員工/新增新”行為離子。 測試1 測試2 結論 這是我們第三天的節目。在第四天,我們將把我們的專案進入下一個版本。下面是第四天的議程 實現客戶端驗證理解HTML助手實現身份驗證新增頁尾與部分檢視建立與母版頁一致的佈局自定義請求過濾 在Facebook, LinkedIn或twitter上聯絡我們,以保持最新的版本。 如需在孟買進行線下技術培訓,請訪問StepByStepSchools.Net 線上培訓請訪問JustCompile.com 本文轉載於:http://www.diyabc.com/frontweb/news1716.html