2011-04-02 211 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 [“警告”]在我的控制器。