繁体   English   中英

验证不适用于ViewModel

[英]Validation not working on ViewModel

好的,我有一个看起来像这样的ViewModel:

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'的值。

不应该是'假的',因为我已经将这些字段标记为'必需'而没有输入任何值?

看看最新的RC for ASP.NET MVC。 它包括一些修复。

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

具体来说,从发布说明:

默认验证系统验证整个模型
ASP.NET MVC 1.0中的默认验证系统和RC 2之前的ASP.NET MVC 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

我之前遇到过同样的问题,但我使用的是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获取

我找出了我特定问题的原因。

在我的ViewModel属性上使用[Required]属性时,我已经为错误指定了资源类型和资源名称。

例:

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

但是我忽略了将FirstNameError资源设为'public'; 它仍然标记为“内部”,因此无法访问。

将它设置为public后,一切正常,ModelState.IsValid包含正确的值。

我很惊讶没有出现任何错误,这种情况无声无息,但现在我知道为什么了。

(是的,我应该从一开始就提到我正在使用资源。我错误地认为这是无关紧要的,但事实证明它非常相关。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM