2011-04-02 212 views
0

我正在使用FluentValidation來驗證我的模型,它工作的很棒。ASP.NET MVC查看消息

我有一個問題,雖然是你如何處理消息不附加到屬性?

示例:客戶登錄視圖。當登錄無效時,我想顯示一條簡單的消息。

我所做的是將一個屬性添加到模型Message,然後在該視圖上爲該屬性創建驗證消息。

它的工作原理,但看着別人在做什麼。

更新

所以爲了簡單起見,考慮以下幾點:

視圖模型

'Uses a FluentValidation Validator 
Public Class LogonViewModel 
    Public Property UserName AS String<br> 
    Public Property Password AS String 
End Class 

查看

<div id="GenericMessage">--Generic Messages Go Here--</div> 
@<table border="0" cellpadding="2" cellspacing="0"> 
    <tr> 
     <td>User Name:</td> 
     <td>@Html.EditorFor(Function(x) x.UserName) @Html.ValidationMessageFor(Function(x) x.UserName)</td> 
    </tr> 
    <tr> 
     <td>Password:</td> 
     <td>@Html.EditorFor(Function(x) x.Password) @Html.ValidationMessageFor(Function(x) x.Password)</td> 
    </tr> 
    <tr> 
     <td></td> 
     <td><input type="submit" value="Logon" /></td> 
    </tr> 
</table> 

我想要做的是我可以顯示消息的通用消息div,如「無效登錄」。我的問題是我在哪裏把它放在模型中?我是否創建一個屬性,然後將其設置在控制器ModelState?或者我應該使用ViewData

回答

2

任何你沒有用你的錯誤使用ModelState的原因?例如,如果您的視圖模型具有日期時間屬性並且用戶輸入類似「blah」的內容,那麼當您再次渲染視圖時,ModelState將自動返回該錯誤。

該錯誤可以在驗證摘要檢索...

<%: Html.ValidationSummary() %> 

或者你可以把它綁定到特定的表單元素。

<%: Html.ValidationMessageFor(m => m.Birthdate) %> 

您還可以手動將錯誤消息添加到控制器的ModelState中。

// for a specific property 
ModelState.AddModelError("Birthdate", "You can't use this date!") 

// to show in summary 
ModelState.AddModelError("", "Dates are too close!") 

如果你只是一個方式,從您的控制器的東西傳達給你的觀點(不是錯誤等)之後,那麼我認爲這很好的屬性添加到您的視圖模型,在你的控制器爲它分配一個值,然後在您的視圖中訪問它。

而且,如果ModelState不滿足您的需求,我看不出有什麼錯誤,以免發生錯誤。

+0

我正在使用模型狀態,實際上FluentValidation爲你做了我相信。請參閱我的編輯。 – Sam 2011-04-02 22:59:35

+1

您是否嘗試向視圖添加驗證摘要,然後使用ModelState.AddModelError(「」,「錯誤消息」)添加錯誤?帶有一個布爾參數等於true(我相信)的驗證摘要將拾取與特定屬性無關的所有ModelState錯誤。 – Mayo 2011-04-02 23:07:12

1

我有一個問題,但是你是如何處理消息不附加到屬性?

據我所知,從這個問題你是不給任何提示框架來驗證輸入。對?如果是這樣,就這樣做。

將下面的代碼放在您的視圖中;

@Html.ValidationSummary() 

並驗證您的輸入內後操作方法。如果它無效,請將錯誤消息添加到查看狀態。這裏是一個例子;

 if (captchaValid == false) { 

      ModelState.AddModelError("recaptcha", "Invalid characters on securty code! Please try it again"); 
      return View(model); 

     } 
1

雖然我覺得我更喜歡的ModelState中回答我通常做的是確定這樣的事情在我_Layout.cshtml:

@if(TempData["Error"]!=null) 
{ 
    <div class="error">@TempData["Error"]</div> 
} 
@if(TempData["Warning"]!=null) 
{ 
    <div class="warning">@TempData["Warning"]</div> 
} 

那麼我只需要分配的TempData [「錯誤」 ]或TempData [「警告」]在我的控制器。