




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、在本節中將會給movie模型添加驗證邏輯。并且確保這些驗證規則在用戶創建或編輯電影時被執行。保持事情dryasp.net mvc 的核心設計信條之一是dry: 不要重復自己(don t repeat yourself)。asp.net mvc鼓勵您指定功能或者行為,只做一次,然后將它應用到應用程序的各個地方。這可以減少您需要編寫的代碼量,并減少代碼出錯率,易于代碼維護。給 asp.net mvc 和 entity framework code first 提供驗證支持是dry 信條的一次偉大實踐。 您可以在一個地方(模型類)中以聲明的方式指定驗證規則,這個規則會在應用程序中的任何地方執行。讓我
2、們看看您如何在本電影應用程序中,使用此驗證支持。給電影模型添加驗證規則您將首先向movie類添加一些驗證邏輯。打開 movie.cs文件。在文件的頂部添加using語句,從而引用system.componentmodel.dataannotations命名空間:using system.componentmodel.dataannotations;注意,該命名空間不包含system.web。dataannotations 提供了一組內置的驗證特性,您可以以聲明的方式,應用于任何類或屬性。更新movie類,以利用內置的required、stringlength和range驗證屬性。以下面的代碼為
3、例,以應用驗證屬性。public class movie public int id get; set; required public string title get; set; datatype(datatype.date) public datetime releasedate get; set; required public string genre get; set; range(1, 100) datatype(datatype.currency) public decimal price get; set; stringlength(5) public string rati
4、ng get; set; 運行該應用程序,您會再次得到了以下的運行時錯誤:the model backing the moviedbcontext context has changed since the database was created. consider using code first migrations to update the database (http:/ 。生成解決方案, 然后打開 軟件包管理器控制臺窗口,并輸入以下命令:add-migration adddataannotationsmigupdate-database當此命令完后,visual studio會打
5、開指定名稱(adddataannotationsmig)的文件,其中定義了派生自dbmigration的新類,并在up方法中,您可以看到代碼更新的schema 和約束條件。title和genre字段不再可以為null (即,您必須輸入一個值)并且rating字段具有最大長度是5。驗證屬性將指定一個驗證行為,這樣您可以指定模型中的那個屬性需要被強制驗證。required屬性指示該屬性必須有一個值,在此示例中,一部電影必須要有title、releasedate、genre和price屬性的值, 這樣才有效。range屬性限制了一個指定范圍內的值。stringlength屬性允許您設置一個字符串屬性
6、的最大長度和其最小長度(可選)。內部類型 (例如decimal, int, float, datetime) 默認是必須的, 所以不需要required屬性。code first 確保您在模型類上所指定的驗證規則,會在應用程序修改數據庫之前執行。例如,下面的代碼在調用savechanges方法時,將引發異常,因為缺失幾個必需的movie屬性值,并且價格為零(這在有效范圍之外)。moviedbcontext db = new moviedbcontext(); movie movie = new movie(); movie.title = gone with the wind; movie.p
7、rice = 0.0m; db.movies.add(movie); db.savechanges(); / = will throw server side validation exception 驗證規則會自動被 .net framework執行,這將有助于使您的應用程序更加的可靠。它還確保你不會因為忘了驗證,無意中使得壞的數據也寫入到了數據庫。下面是更新后的movie.cs文件的完整代碼清單:using system; using system.data.entity; using system.componentmodel.dataannotations; namespace mvc
8、movie.models public class movie public int id get; set; required public string title get; set; datatype(datatype.date) public datetime releasedate get; set; required public string genre get; set; range(1, 100) datatype(datatype.currency) public decimal price get; set; stringlength(5) public string r
9、ating get; set; public class moviedbcontext : dbcontext public dbset movies get; set; asp.net mvc 的驗證錯誤ui重新運行應用程序,瀏覽/movies的 url。單擊 create new鏈接,來添加一部新電影。在窗體中填寫一些無效值,然后單擊create按鈕。注意 ,為了使 jquery支持使用逗號的非英語區域的驗證,需要設置逗號(,)來表示小數點,你需要引入globalize.js并且你還需要具體的指定cultures/globalize.cultures.js文件 (地址在https:/ 在
10、javascript 中可以使用globalize.parsefloat。下面的代碼展示了在fr-fr culture下的viewsmoviesedit.cshtml 視圖:section scripts scripts.render(/bundles/jqueryval) $.validator.methods.number = function (value, element) return this.optional(element) | !isnan(globalize.parsefloat(value); $(document).ready(function () globalize
11、.culture(fr-fr); ); jquery.extend(jquery.validator.methods, range: function (value, element, param) /use the globalization plugin to parse the value var val = $.global.parsefloat(value); return this.optional(element) | ( val = param0 & val = param1); ); 為了使用這種用戶驗證界面,真正的好處是,您不需要修改moviescontroller
12、類或create.cshtml視圖中的任何一行代碼。在本教程之前所生成的控制器和視圖中,movie模型類的屬性上所指定的驗證規則一樣可以自動適用。您可能已經注意到了title和genre屬性,在字段中輸入文本或者刪除文本,是不會執行所需的驗證屬性的,直到您提交表單(點 create按鈕 )時才執行。 對于字段是最初為空(如創建視圖中的字段)和只有 required屬性并沒有其它驗證屬性的字段,您可以執行以下操作來觸發驗證:1. tab into the field.2. enter some text.3. tab out.4. tab back into the field.5. remov
13、e the text.6. tab out.上面的順序將觸發必需的驗證,而并不需要點擊提交按鈕。在不輸入任何字段的情況下,直接點擊提交按鈕,將觸發客戶端驗證。直到沒有客戶端驗證錯誤的情況下,表單數據才會發送到服務器。 您可以在服務器端http post 方法上加上斷點來測試一下,或者使用fiddler tool或 ie 9 f12 developer tools.如何驗證創建視圖和創建方法您可能很想知道驗證用戶界面在沒有更新控制器或視圖代碼的情況下是如何生成的。下面列出了moviecontroller類中的create方法。它們是之前教程中自動生成的,并沒有修改。/ / get: /movie
14、s/create public actionresult create() return view(); / / post: /movies/create httppost public actionresult create(movie movie) if (modelstate.isvalid) db.movies.add(movie); db.savechanges(); return redirecttoaction(index); return view(movie); 第一種( http get )create方法用來顯示初始的創建form 。 第二個 (httppost) 方法處
15、理 form的請求。第二種create方法(httppost版本)調用modelstate.isvalid來檢查是否有的任何的movie驗證錯誤。調用此方法將驗證對象上所有應用了驗證約束的屬性。如果對象含有驗證錯誤,則create方法會重新顯示初始的form 。如果沒有任何錯誤,方法將保存信息到數據庫。在我們的電影示例中,我們使用了驗證, 當客戶端檢測到錯誤時,form不會被 post到服務器;所以第二個create方法永遠不會被調用 。 如果您在瀏覽器中禁用了javascript , 客戶端驗證也會被禁用,http post create方法會調用modelstate.isvalid來檢查影
16、片是否含有任何驗證錯誤。您可以在httppost create方法中設置一個斷點,當客戶端驗證檢測到錯誤時,不會 post form數據,所以永遠不會調用該方法。如果您在瀏覽器中禁用javascript ,然后提交具有錯誤信息的form ,斷點將會命中。您仍然得到充分的驗證,即使在沒有javascript的情況下。下圖顯示了如何禁用internet explorer 中的javascript 。下圖顯示了如何在火狐瀏覽器中禁用javascript 。下圖顯示了如何在chrome 瀏覽器中禁用javascript 。下面是框架代碼在之前的教程中生成的create.cshtml視圖模板。它用來為以
17、上兩個操作方法來顯示初始的form ,同時在驗證出錯時來重新顯示視圖。model mvcmovie.models.movie viewbag.title = create; create using (html.beginform() html.validationsummary(true) movie html.labelfor(model = model.title) html.editorfor(model = model.title) html.validationmessagefor(model = model.title) html.labelfor(model = model.r
18、eleasedate) html.editorfor(model = model.releasedate) html.validationmessagefor(model = model.releasedate) html.labelfor(model = model.genre) html.editorfor(model = model.genre) html.validationmessagefor(model = model.genre) html.labelfor(model = model.price) html.editorfor(model = model.price) html
19、.validationmessagefor(model = model.price) html.labelfor(model = model.rating) html.editorfor(model = model.rating) html.validationmessagefor(model = model.rating) html.actionlink(back to list, index) 請注意,代碼如何使用html.editorfor helper 輸出為movie中的每個屬性的元素。此helper旁邊是對html.validationmessagefor方法的調用。這兩個help
20、er方法將處理由控制器傳遞到視圖的模型對象(在這里是,movie對象)。它們會自動查找模型中指定的驗證屬性,并顯示適當的錯誤消息。如果您想要在后面更改驗證邏輯,您可以做在一個地方,將驗證信息添加到模型上。(此示例中,是movie類)。您不必擔心不符合規則,驗證邏輯會在應用程序的不同部分執行在一個地方定義驗證邏輯將會被使用到各個地方。這使代碼非常干凈,并使它易于維護和擴展。它意味著您會完全遵守dry 原則。給影片模型添加formatting打開 movie.cs文件并查看movie類。system.componentmodel.dataannotations命名空間提供了內置的驗證特性集的格式屬
21、性。我們已經為發布日期和價格字段應用了datatype枚舉值。下面的代碼示例了releasedate和price屬性與相應的displayformat屬性。datatype(datatype.date) public datetime releasedate get; set; datatype(datatype.currency) public decimal price get; set; datatype屬性不是驗證特性,它們用來告訴視圖引擎如何render html 。在上面的示例中,datatype.date屬性將影片日期顯示為日期,例如, 下面的datatype屬性不會驗證數據的格式:datatype(datatype.emailaddress) datatype(datatype.phonenumber) datatype(datatype.url)上面列出的屬性只提供視圖引擎來顯示數據的格式(如: 為 url , 為電子郵件。 您可以使用 正則表達式 屬性來驗證數據的格式。)另一種使用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國中鹽榨菜絲行業市場發展前景及發展趨勢與投資戰略研究報告
- 中國飼料用魚粉行業市場前景預測及投資戰略研究報告
- 2025年 達州市大竹縣鄉村職業經理人招聘筆試試題附答案
- 中國遠程協作辦公行業市場深度研究及投資戰略規劃報告
- 花葉項目投資可行性研究分析報告(2024-2030版)
- 紅外防水攝像機外殼項目投資可行性研究分析報告(2024-2030版)
- 中國有線數字電視增值業務行業市場深度調查評估及投資方向研究報告
- 中國鐵路車輛設備行業發展運行現狀及發展趨勢預測報告
- 鈦封頭行業深度研究分析報告(2024-2030版)
- 北京消防培訓課件
- 高墩柱墩身施工方案
- 2023年甘肅蘭州大學網絡與繼續教育學院人員招聘2人高頻考點題庫(共500題含答案解析)模擬練習試卷
- 肝內膽管結石詳解
- 發電機勵磁系統檢修與維護
- 2023-2024學年福建省泉州市小學語文六年級期末自測模擬試卷
- GB 29541-2013熱泵熱水機(器)能效限定值及能效等級
- 控規用地代碼
- 2023年上杭縣社區工作者招聘考試筆試題庫及答案解析
- 2021年曹楊二中自招數學試卷
- 新能源汽車底盤檢修全套課件
- 幼兒園大班數學口算練習題可打印
評論
0/150
提交評論