ASP.NET MVC仅针对某些属性检查状态

时间:2017-04-02 08:19:11

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我是MVC的新手,我正面临这个问题。

我正在设计一个允许用户以两种不同形式修改其个人资料和密码的视图。

这是我的主要行动:

public ActionResult ModifyAccount()
{
    User user = this._userManager.FindById(User.Identity.GetUserId());
    ViewBag.User = user;
    return View(new AccountViewModel
    {
        User = user
    });
}

在我的ModifyAccount视图中,我有2个表单:

@using (Html.BeginForm("ModifyPassword", "Account", FormMethod.Post))
{
    // Change password
}

@using (Html.BeginForm("ModifyProfile", "Account", FormMethod.Post))
{
    // Change profile
}

这是我的模特

public class AccountViewModel
    {
        public User User { get; set; } // For change profile

        // For change password
        [Display(Name = "Mật khẩu cũ")]
        public string OldPassword { get; set; }
        [Display(Name = "Mật khẩu mới")]
        public string NewPassword { get; set; }
        [Display(Name = "Xác nhận mật khẩu mới")]
        [Compare("NewPassword", ErrorMessage = "Mật khẩu xác nhận không trùng khớp")]
        public string NewPasswordConfirm { get; set; }
    }

我知道当我们使用ModelState.IsValid时,整个模型将被验证。我想要的是如果用户提交ModifyPassword表单,将只验证3个属性OldPassword,NewPassword,NewPasswordConfirm。请帮忙,谢谢!

3 个答案:

答案 0 :(得分:0)

使用IValidatableObject进行自定义多值验证

public class AccountViewModel : IValidatableObject
{
    [Display(Name = "Mật khẩu cũ")]
    public string OldPassword { get; set; }
    [Display(Name = "Mật khẩu mới")]
    public string NewPassword { get; set; }
    [Display(Name = "Xác nhận mật khẩu mới")]
    [Compare("NewPassword", ErrorMessage = "Mật khẩu xác nhận không trùng khớp")]
    public string NewPasswordConfirm { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (// Do something here)
        {
            yield return new ValidationResult("Error Message");
        }
    }
}

public ActionResult ModifyAccount()
{
    if (!ModelState.IsValid)
    {
    }

}

答案 1 :(得分:0)

使用3个属性OldPassword,NewPassword,NewPasswordConfirm创建一个ViewModel,并将其作为ModifyPassword的Post版本中的参数接收:

Class ModifyPasswordView 
{
    public string OldPassword {get;set;}
    public string NewPassword {get;set;}
    public bool NewPasswordConfirm {get;set;}
}

[HttpPost]
public ActionResult ModifyPassword( ModifyPasswordView passwordView)
{
     if ( ModelState.IsValid )
     {
        ...
     }
}

上面的模型状态检查仅查看ModifyPasswordView模型中的3个字段,而不管表单中的字段是什么

答案 2 :(得分:0)

为更新密码创建专用视图模型:

public class ModifyPasswordViewModel
{
    [Display(Name = "Mật khẩu cũ")]
    [Required]
    public string OldPassword { get; set; }

    [Display(Name = "Mật khẩu mới")]
    [Required]
    public string NewPassword { get; set; }

    [Display(Name = "Xác nhận mật khẩu mới")]
    [Required]
    [Compare("NewPassword", ErrorMessage = "Mật khẩu xác nhận không trùng khớp")]
    public string NewPasswordConfirm { get; set; }
}

创建部分视图_ModifyPasswordViewModel.cshtml。由于您在同一页面上显示多个视图,我将使用Ajax.BeginForm而不是Html.BeginForm仅用于通过ajax修改密码而不是通过完整的表单发布。

_ModifyPasswordViewModel.cshtml:

@model ModifyPasswordViewModel

@using (Ajax.BeginForm("ModifyPassword", "Account", new AjaxOptions { OnSuccess = "changePasswordSuccess"}))
{
    <div class="form-group">
       @Html.LabelFor(m=>m.OldPassword)
       @Html.PasswordFor(m=>m.OldPassword)
       @Html.ValidationMessageFor(m=>m.OldPassword)
    </div>
    ...
}

在主视图中渲染部分:

<div id="changePassword-container">
  @{Html.RenderPartial("_ModifyPasswordViewModel", new ModifyPasswordViewModel());}
<div/>

控制器操作:

[HttpPost]
public ActionResult ModifyPassword(ModifyPasswordViewModel model)
{
     if ( this.ModelState.IsValid )
     {
        ...
     }
}

PS 为了使客户端验证工作,您需要在视图(布局页面)中包含jquery.validate.js和jquery.validate.unobtrusive.js并在Web配置中启用它:

<configuration>
  <appSettings>  
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
</configuration>