2013-11-21 47 views
1

我甲肝視圖模型爲什麼我的模型在調用我的控制器操作時未被驗證數據註釋?

public class MyViewModel 
{ 
    [RegularExpression(@"^([0-9a-zA-Z]+([-._])?)?[0-9a-zA-Z]+(\2?[0-9a-zA-Z]+)*$")] 
    public string UserName { get; set; } 
} 

我的我的控制器內的行動:

[HttpPost] 
public ActionResult Edit(MyViewModel model, string button) 

我的單元測試,測試所解釋here

如果我測試類似的模型數據annotaion驗證這個與空間名稱(稱爲「羅伯特約翰遜」)的正則表達式,它不匹配。 如果我在單元測試中使用相同的輸入,則測試通過時會出現錯誤(預期行爲)

但是當我調用動作時,動作通常接受數據。如果我調用ModelState.IsValid,則返回「false」。

據我所知,如果模型驗證失敗,我的行爲不應該被調用。我如何確保這種行爲?

+1

只有在客戶端驗證處於活動狀態並且數據無效時纔會調用它。否則,您的操作將正常發送數據以驗證服務器端。 –

+0

明天我會研究一下,並告訴你這是否有效。 TKS! – JSBach

+5

請注意,無論數據是否有效,您的操作都會在某個時刻被調用。請記住,客戶端驗證基本上是出於可用性原因。驗證應該在服務器上發生。客戶端驗證是可選的;服務器端不是。 –

回答

4

數據註釋可用於驗證服務器上的客戶端上的模型。

在服務器端,DefaultModelBinder將自動驗證發佈到您的操作方法的模型,但它不會阻止無效模型被POST。它將簡單地將該錯誤添加到ModelState並將ModelState.IsValid屬性設置爲false(如您所發現的)。這意味着你需要檢查ModelState.IsValid財產並重新與模型的形式,如果它是無效的:

[HttpPost] 
public ActionResult Edit(MyViewModel model, string button) 
{ 
    if (!ModelState.IsValid) 
    { 
     // The model isn't valid. 
     // Redisplay the form with the invalid model. 
     return View(model); 
    } 


    // If we got here it means the model is valid. 
} 

重新顯示與無效模型的形式將允許任何@Html.ValidationSummary()@Html.ValidationMessageFor(m => m.UserName)輔助方法來呈現他們的驗證錯誤消息到頁面。

據我所知,如果模型驗證失敗,我的行爲不應該被調用。

只有在啓用了客戶端驗證的情況下才會出現這種情況。

<appSettings> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings> 

...並添加引用到jquery.validate.jsjquery.validate.unobtrusive.js:您可以通過添加以下的appSettings到Web.config文件做到這一點腳本到你的視圖。這將允許JavaScript在之前驗證模型它被髮送到服務器和驗證消息將顯示沒有頁面刷新(好得多的用戶和您的服務器!)。正如@John H在問題評論中指出的,客戶端驗證不能代替服務器端驗證。所以一定要保留你的服務器端驗證檢查。

+0

感謝你和@John H,我從你們兩個人身上學到了很多東西。我仍然錯過了某些東西來阻止回覆我的行爲,我會花更多的時間重新閱讀你回答並研究它。如果我失敗了,我可能會回到這個問題:) – JSBach

+0

僅供參考,我沒有提到Jquery。現在它完美地工作。謝謝你們:D – JSBach

相關問題