ASP.NET MVC 驗證方式(1)

作者: 思背后  來源: 博客園  發布時間: 2010-02-08 15:13  閱讀: 10563 次  推薦: 1   原文鏈接   [收藏]  

  實現一個簡單的驗證(C#)

  本部分主要目的是說明如何在ASP.NET MVC應用程序中實現驗證。例如,將了解如何驗證一個表單提交時必填內容的合法性。了解如何應用model state和驗證相關的HTML helpers

  理解Model State

  你使用model state,更準確點說是使用model state 字典去表示驗證錯誤。比如,列表一中的Create()方法,在產品類保存入庫之前去驗證產品類的屬性。

  把驗證和數據邏輯加到控制類中是違反編程方法的,控制類中應該僅包含程序的流程邏輯。此處是為了便于說明才這樣寫的。

  列表1---Controllers\ProductController.cs

代碼
 
//
// POST: /Product/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")] Product productToCreate)
{

// Validation logic
if (productToCreate.Name.Trim().Length == 0)
ModelState.AddModelError(
"Name", "Name is required.");
if (productToCreate.Description.Trim().Length == 0)
ModelState.AddModelError(
"Description", "Description is required.");
if (productToCreate.UnitsInStock < 0)
ModelState.AddModelError(
"UnitsInStock", "Units in stock cannot be less than zero.");
if (!ModelState.IsValid)
return View();

// Database logic
try
{
_entities.AddToProductSet(productToCreate);
_entities.SaveChanges();

return RedirectToAction("Index");
}

catch
{
return View();
}
}

  在列表一中,產品的名稱,簡介,單價等屬性都被驗證。如果任何一個屬性的驗證失敗,相應的錯誤就會被加到model state字典。

  如果在mode state中有任何一個錯誤,ModelState.IsValid屬性都返回的是false。在這種情況下,創建一個新產品的HTML 表單將會再次被顯示。否則,如果沒有任何錯誤,新產品就被加到數據庫。

  使用Helpers驗證

  ASP.NET MVC 包含兩個驗證Helper:Html.ValidationMessage()和Html.ValidationSummary()。使用這兩個方法在視圖類中去顯示錯誤信息。

  在ASP.NET MVC框架自動產生的視圖中使用Html.ValidationMessage()和Html.ValidationSummary()。按照如下步驟產生Create視圖:

  1. 在產品控制類右鍵單擊Create()方法,選擇Add View選項(如圖一)。

  2. 在Add view對話框中,選中Create a strongly-typed view (如圖2)。

  3. 從View data class下拉列表中,選擇Product類。

  4. 從view content下拉列表中,選擇Create.

  5. 單擊add按鈕。

  確保在添加視圖之前重新生成解決方案,否則,在View data class下拉列表框中不會出現類的列表。

  圖1:

  圖2:

  在完成這些步驟之后,得到列表二的Create視圖。

  列表2---views\Product\Create.aspx

代碼
 
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Product>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<title>Create</title>
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Create</h2>

<%= Html.ValidationSummary() %>

<% using (Html.BeginForm()) {%>

<fieldset>
<legend>Fields</legend>
<p>
<label for="Name">Name:</label>
<%= Html.TextBox("Name") %>
<%= Html.ValidationMessage("Name", "*") %>
</p>
<p>
<label for="Description">Description:</label>
<%= Html.TextBox("Description") %>
<%= Html.ValidationMessage("Description", "*") %>
</p>
<p>
<label for="Price">Price:</label>
<%= Html.TextBox("Price") %>
<%= Html.ValidationMessage("Price", "*") %>
</p>
<p>
<label for="UnitsInStock">UnitsInStock:</label>
<%= Html.TextBox("UnitsInStock") %>
<%= Html.ValidationMessage("UnitsInStock", "*") %>
</p>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>

<% } %>

<div>
<%=Html.ActionLink("Back to List", "Index") %>
</div>

</asp:Content>

  在列表2中,Html.ValidationSummary()被HTML表單自動調用。它被用來去顯示一組驗證錯誤信息。它顯示的一個具有圓點標記的錯誤信息列表。

  Html.ValidationSummary()被Html表單的對應部分調用。它用來在對應表單項的右邊顯示一個錯誤信息,在列表2中的情況,如果有一個錯誤它就會顯示*號。

  圖3中,當表單中對應項為空或值無效時驗證不過,提示的信息。

  驗證錯誤出現的樣式是可以修改的。

  有三個樣式表類用來控制驗證錯誤信息的樣式:

  1.Input-validation-err

  2.Field-validation-error

  3.Validation-summary-errors

  可以通過修改Content文件夾下的Site.css文件來修改驗證錯誤的樣式。

  HtmlHelper類包含了只讀靜態屬性,ValidationInputCssClassName, ValidationFieldCssClassName, and ValidationSummaryCssClassName。

  預定義綁定驗證和已綁定驗證

  如果你提交這個表單去創建一個新產品,輸入一個無效字段,和空字段,這時你將會得到如圖4所示的驗證信息。這些錯誤信息是從哪里來的?

  圖4

  實際上驗證信息有兩種類型--在表單字段被綁定到類之前和之后產生的錯誤信息。也就是,預綁定驗證錯誤和已綁定驗證錯誤。

  在列表1中的Product控制器的Create()方法接受一個產品類的實列。如下所示:

 
public ActionResult Create([Bind(Exclude="Id")] Product productToCreate)

  Create表單中的字段值是通過model binder綁定到productToCreate類的。當它不能把表段字段的值綁定到表單屬性的時候,它就會自動的把一個錯誤信息加到model state中。

  默認的model binder不能夠把字符串“apple“綁定到產品類的價格屬性上。不能把一個字符綁定到數值型屬性上。因此,model biner把一個錯誤信息加到了model state.

  默認的model binder也不能把一個null值綁定到一個不接受null值的屬性。

  如果想要自定義一些預綁定錯誤信息,這時需要為這些信息創建資源。

  總結:

  本部分描述了一個基本固定的ASP.NET MVC的驗證方式。了解了如何使用model stateHTML helper。也討論了預定義綁定和已綁定驗證的區別。在以后部分將討論把驗證代碼從控制部分轉移到model部分。

1
0
 
標簽:MVC
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()