2012-07-29 58 views
0

假设这种模式:ASP.NET MVC3比较验证无法正常工作

@model ChangePasswordModel 
@{ 
ViewBag.Title = "Profile"; 
} 

@using (Html.BeginForm()) { 
      @Html.ValidationSummary(true) 
      <fieldset> 
       <legend>Change Password</legend> 
       <dl> 
        <dt>@Html.LabelFor(model => model.OldPassword)</dt> 
        <dd> 
         @Html.EditorFor(model => model.OldPassword) 
         @Html.ValidationMessageFor(model => model.OldPassword, null, new { @class = "invalid-side-note" }) 
        </dd> 
        <dt>@Html.LabelFor(model => model.NewPassword)</dt> 
        <dd> 
         @Html.EditorFor(model => model.NewPassword) 
         @Html.ValidationMessageFor(model => model.NewPassword, null, new { @class = "invalid-side-note" }) 
        </dd> 
        <dt>@Html.LabelFor(model => model.ConfirmPassword)</dt> 
        <dd> 
         @Html.EditorFor(model => model.ConfirmPassword) 
         @Html.ValidationMessageFor(model => model.ConfirmPassword, null, new { @class = "invalid-side-note" }) 
        </dd> 
       </dl> 
       <input type="submit" value="Save" class="button red inframebutton" /> 
      </fieldset> 
} 

所以我需要使用一些通用的模型:

public class ChangePasswordModel { 
    [Required(ErrorMessage = CustomRegex.RequiredErMsg)] 
    [DataType(DataType.Password)] 
    [Display(Name = "Current password")] 
    public string OldPassword { get; set; } 

    [Required(ErrorMessage = CustomRegex.RequiredErMsg)] 
    [RegularExpression(CustomRegex.PasswordRX, ErrorMessage = CustomRegex.PasswordErMsg)] 
    [DataType(DataType.Password)] 
    [Display(Name = "New password")] 
    public string NewPassword { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm new password")] 
    [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 
} 

OK,每一件事情这个观点非常完美

public class ViewModel<T> { 

    public T MainModel { get; set; } 
    public ViewPart ViewPart { get; set; } 
    } 

然后我通过查看此通用视图并将视图更改为:

@model ViewModel<ChangePasswordModel> 
@using (Html.BeginForm()) { 
      @Html.ValidationSummary(true) 
      <fieldset> 
       <legend>Change Password</legend> 
       <dl> 
        <dt>@Html.LabelFor(model => model.MainModel.OldPassword)</dt> 
        <dd> 
         @Html.EditorFor(model => model.MainModel.OldPassword) 
         @Html.ValidationMessageFor(model => model.MainModel.OldPassword, null, new { @class = "invalid-side-note" }) 
        </dd> 
        <dt>@Html.LabelFor(model => model.MainModel.NewPassword)</dt> 
        <dd> 
         @Html.EditorFor(model => model.MainModel.NewPassword) 
         @Html.ValidationMessageFor(model => model.MainModel.NewPassword, null, new { @class = "invalid-side-note" }) 
        </dd> 
        <dt>@Html.LabelFor(model => model.MainModel.ConfirmPassword)</dt> 
        <dd> 
         @Html.EditorFor(model => model.MainModel.ConfirmPassword) 
         @Html.ValidationMessageFor(model => model.MainModel.ConfirmPassword, null, new { @class = "invalid-side-note" }) 
        </dd> 
       </dl> 
        <input type="submit" value="Save" class="button red inframebutton" /> 
      </fieldset> 
} 

然后我有compare验证一个问题,因为你在模型中看到比较验证必须比较ConfirmPasswordNewPassword但与OldPassword是如此有线相比,这种新的变化ConfirmPassword。我想,这也许是因为元素的名称或ID的变化,所以我尝试

[Compare("MainModel.NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] 

而且

[Compare("MainModel_NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] 

但他们没有没有工作,有什么问题呢?以及如何使用此新模型进行比较验证?有什么办法吗?

+1

检查这个问题的http://计算器.com/questions/8376322/mvc3-compareattribute-client-side-bug可能具有相同的问题。 – nemesv 2012-07-29 07:21:29

回答

1

您还没有涉及脚本,下面我体改编码

型号:

//[Required(ErrorMessage = "CustomRegex.RequiredErMsg")] 
     [Required(ErrorMessage = "Current password is Required")] 
    [DataType(DataType.Password)] 
    [Display(Name = "Current password")] 
    public string OldPassword { get; set; } 


     [Required(ErrorMessage = "New password is Required")] 
    [DataType(DataType.Password)] 
    [Display(Name = "New password")] 
    public string NewPassword { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm new password")] 
    [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 
    } 

查看:

@model test.Models.password 

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) 

{ 

      <fieldset> 
       <legend>Change Password</legend> 
       <dl> 
        <dt>@Html.LabelFor(model => model.OldPassword)</dt> 
        <dd> 
         @Html.EditorFor(model => model.OldPassword) 
         @Html.ValidationMessageFor(model => model.OldPassword, null, new { @class = "invalid-side-note" }) 
        </dd> 
        <dt>@Html.LabelFor(model => model.NewPassword)</dt> 
        <dd> 
         @Html.EditorFor(model => model.NewPassword) 
         @Html.ValidationMessageFor(model => model.NewPassword, null, new { @class = "invalid-side-note" }) 
        </dd> 
        <dt>@Html.LabelFor(model => model.ConfirmPassword)</dt> 
        <dd> 
         @Html.EditorFor(model => model.ConfirmPassword) 
         @Html.ValidationMessageFor(model => model.ConfirmPassword, null, new { @class = "invalid-side-note" }) 
        </dd> 
       </dl> 
        <input type="submit" value="Save" class="button red inframebutton" /> 
      </fieldset>