2010-02-13 84 views
3

好吧,我有一個視圖模型,看起來像這樣:驗證不工作的視圖模型

public class UserLogin 
{ 
    [Required] 
    public string EmailAddress { get; set; } 

    [Required] 
    public string Password { get; set; } 
} 

我的控制器看起來是這樣的:

[HttpPost] 
public ActionResult LogIn(UserLogin model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // ... 
    } 
} 

我的看法是這樣的:

<% Html.BeginForm("Join", "User", FormMethod.Post); %> 
    <%= Html.Hidden("ReturnUrl", Request.Url.AbsolutePath) %> 

    <%= Html.TextBoxFor(c => c.EmailAddress, new { id = "join-emailaddress", @class = "text", uiHintText = "Email address" })%> 
    <%= Html.ValidationMessageFor(c => c.EmailAddress, "*") %> 

    <%= Html.PasswordFor(c => c.Password, new { id = "join-password", @class = "text", uiHintText = "Password" })%> 
    <%= Html.ValidationMessageFor(c => c.Password, "*")%> 

    <%= Html.PasswordFor(c => c.PasswordConfirm, new { id = "join-password-confirm", @class = "text", uiHintText = "Password (repeat)" })%> 
    <%= Html.ValidationMessageFor(c => c.PasswordConfirm, "*")%> 

    <input type="submit" value="Sign me up!" class="submit" /> 
<% Html.EndForm(); %>     

如果我發佈沒有輸入任何字段的表單,我始終會爲'ModelState.IsValid'獲取'true'的值。

它不應該是'假',因爲我已經將這些字段標記爲'必需'並且沒有輸入任何值?

回答

2

查看最新的RC for ASP.NET MVC。它包含一些修補程序。

http://haacked.com/archive/2010/02/04/aspnetmvc2-rc2.aspx

具體而言,從發佈說明:

默認確認系統驗證整個模型
ASP.NET中的默認 確認系統MVC 1.0 和ASP.NET中的預覽MVC 2之前 到RC 2僅驗證模型 屬性被髮布到 服務器。在ASP.NET MVC 2 RC2中,新的 行爲是驗證所有模型屬性 ,當驗證模型爲 時,無論是否發佈了新的 值。

有關此更改的詳細信息,請參閱Brad Wilson的博客以下發帖:

輸入驗證與模型驗證在ASP.NET MVC
http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html

+0

我升級到ASP.NET MVC 2 RC 2 ,但我仍然有完全相同的問題。似乎升級改變了一件事情。 – Jonathan 2010-02-14 12:21:23

+0

我認爲它現在已經修復了,但是一個奇怪的修復...在@ H_Sampat的回答下查看我的評論。 – Jonathan 2010-02-14 12:41:33

1

我有同樣的問題較早,但我使用的是ASP.NET MVC1。 但是我通過在Global.asax.vb文件中添加以下代碼解決了該問題。

Sub Application_Start() 
    RegisterRoutes(RouteTable.Routes) 

    'Added following line 
    ModelBinders.Binders.DefaultBinder = New Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder()   
End Sub 

您需要導入Microsoft.Web.Mvc.DataAnnotations.dll。你可以從http://aspnet.codeplex.com/releases/view/24471

+0

已修復!我將下面的語句添加到Application_Start函數中:ModelBinders.Binders.DefaultBinder = new System.Web.Mvc.DefaultModelBinder();.我想知道爲什麼這將是必要的。當我有時間的時候,我會再看看它。 – Jonathan 2010-02-14 12:42:44

+0

呃..我錯了。第二次運行這個項目,它又回到給我一個'ModelState.IsValid'的'真實'...我必須再次檢查我所做的所有更改,並找出它爲什麼會破壞... – Jonathan 2010-02-14 13:18:50

1

我想出了我的特定問題的原因。

在我的ViewModel屬性上使用[必需的]屬性時,我指定了錯誤的資源類型和資源名稱。

例子:

[Required(ErrorMessageResourceName = "FirstNameError", 
      ErrorMessageResourceType = typeof(MyResourceFile))] 
public string FirstName { get; set; } 

但是我會忽略了將FirstNameError資源 '公共';它仍然被標記爲「內部」,因此無法訪問。

將它設置爲公共狀態後,一切正常,ModelState.IsValid包含正確的值。

我很驚訝沒有錯誤發生,這失敗了默默,但現在我知道爲什麼。

(是的,我應該從我所用的資源開始時提到,讓我誤以爲這是無關緊要的,但它被證明是非常相關的。)

+0

Make如果你認爲這是一個善意的錯誤,那麼你肯定讓菲爾·哈克知道這件事。 http://haacked.com/contact.aspx。很高興能夠進入最終版本。 – 2010-02-15 01:51:20

+0

好主意!我給菲爾發了一條消息。 – Jonathan 2010-02-17 02:48:29