asp.net-mvc - 嵌套对象的远程 ViewModel 验证不起作用

标签 asp.net-mvc asp.net-mvc-3 asp.net-mvc-validation

我有一个类用户,如下所示:

public class User
{
    public int UserId { get; set; }

    [Required(ErrorMessage = "A username is required.")]
    [StringLength(20, ErrorMessage = "Your username must be 4-20 characters.", MinimumLength = 4)]
    [RegularExpression("^[a-zA-Z0-9]*$", ErrorMessage = "Your username can only consist of letters and numbers.")]
    [Remote("UsernameExists", "RemoteValidation", ErrorMessage = "Username is already taken")]
    public string Username { get; set; }

    [Required(ErrorMessage = "A password is required.")]
    [MinLength(4, ErrorMessage = "Your password must have at least 4 letters.")]
    public string Password { get; set; }

    [Required(ErrorMessage = "An email address is required.")]
    public string Email { get; set; }
}

对于注册功能,我创建了一个 ViewModel,其中包含一个 User 对象和一个用于密码确认的字符串:

public class RegistrationViewModel
{
    public User User { get; set; }

    [DisplayName("Password confirmation")]
    [Required, Compare("User.Password", ErrorMessage = "The password do not match")]
    public string PasswordConfirmation { get; set; }
}

我遇到的第一个问题是我似乎无法对 Compare("User.Password") 进行验证,因为它似乎找不到用户的属性。有什么方法可以根据 User.Password 属性验证 PasswordConfirmation 属性吗?

第二个问题是用户名字段的远程验证。我遵循了 David Hayden 的教程:http://davidhayden.com/blog/dave/archive/2011/01/04/ASPNETMVC3RemoteValidationTutorial.aspx但UsernameExists方法中的参数username始终为null。我在这里遗漏了什么吗?

编辑:

很抱歉,我实际上对密码比较收到的错误还不够清楚。填写字段时它工作正常,如果密码不匹配,我将收到错误。但是,在提交表单时,我在验证摘要中收到以下错误:找不到名为 UserToRegister.Password 的属性。

编辑2:

多亏了乔的帖子,我已经解决了部分问题。远程验证器发回 URL/?UserToRegister.Username=temp ,这显然与我的 Controller 操作的用户名参数不匹配。为了将我的操作参数映射到 UserToRegister.Username,需要以下内容:

public ActionResult UsernameExists([Bind(Prefix = "UserToRegister.Username")]string username)

现在可以正确地将参数传递给方法。但是,在密码字段上使用“比较”属性时,我仍然收到错误。

谢谢。

最佳答案

针对 User.Password 属性验证 PasswordConfigurmation 属性的问题是由“jquery.validate.unobtrusive.js”文件中的错误引起的。

最初,jquery 'equalTo' 函数是:

adapters.add("equalto", ["other"], function (options) {
var prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];

setValidationValues(options, "equalTo", element);
});

你只需要修改这一行:

element = $(options.form).find(":input[name=" + fullOtherName + "]")[0];

至:

element = $(options.form).find(":input[name='" + fullOtherName + "']")[0];

请注意“fullOtherName”选择器周围添加的单引号。进行此更改后,客户端验证将按预期工作。

关于asp.net-mvc - 嵌套对象的远程 ViewModel 验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5023627/

相关文章:

asp.net-mvc - asp.net mvc 中的安全问题是什么?

asp.net-mvc - 带有 MVC Razor 的输入类型复选框

javascript - 仅适用于数值的 javascript 函数,默认值 "0"

c# - EF 生成的类和模型之间的关系?

c# - 后退按钮和重新提交表单的问题

asp.net-mvc - 没有验证属性的部分 View (ASP.NET MVC 3)

c# - 如何为 404 页面设置 UTF8

c# - 你如何根据用户交替 Ninject 绑定(bind)?

entity-framework - 将 DbContext 注入(inject) FluentValidation 验证器

asp.net-mvc - MVC 数据注释范围验证无法正常工作