子对象的AddModelError?

时间:2012-12-21 12:28:14

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

我的网站上有一个使用这些模型类的设置页面:

public class NameVm
{
    public string GivenName { get; set; }
    public string FamilyName { get; set; }
}

public class PasswordVm
{
    public string OldPassword { get; set; }
    public string NewPassword { get; set; }
    public string ConfirmPassword { get; set; }
}

public class AccountVm
{
    public NameVm Name { get; set; }
    public PasswordVm Password { get; set; }
}

这是控制器:

public class AccountController : Controller
{
    [HttpGet]
    public override ActionResult Index()
    {
        var accountVm = AccountVmFromActiveUser();
        return View(accountVm);
    }

    [HttpPost]
    public ActionResult EditName(NameVm vm)
    {
        ...
    }

    [HttpPost]
    public ActionResult EditPassword(PasswordVm vm)
    {
        if (ModelState.IsValid)
        {
            if (!ValidateUser(this.ActiveUser, vm.OldPassword))
            {
                ModelState.AddModelError("????",
                    "Existing password is incorrect.");
            }
            else
                UpdateUserPassword(vm);
        }

        var accountVm = AccountVmFromActiveUser();
        accountVm.Password = vm;
        return View(accountVm);
    }
}

在我的Account.cshtml文件中,我定义了两个表单 - 一个提交到EditName,一个提交到EditPassword。这是一个大文件,所以这里有一个小摘录:

@Html.EditorFor(model => model.Password.OldPassword)
@Html.ValidationFor(model => model.Password.OldPassword)

我的问题是:如何让ValidationFor显示我在EditPassword方法中添加的错误消息?我尝试使用"Password.OldPassword"的密钥,但这不起作用。

或者,我采取了错误的做法吗?我应该如何在同一页面上处理两个表格?

1 个答案:

答案 0 :(得分:1)

您可以使用部分视图。

1)在Account.cshtml中分隔提交密码的表单并将其放在部分视图中_EditPassword.cshml(通常我将部分视图放在Views\Shared文件夹中)

使用

@Html.Partial("_EditPassword", @Model.Password)

Account.cshtml

中呈现部分视图

2)在部分视图_EditPassword.cshtml中,您可以使用

@Html.EditorFor(model => model.OldPassword)
@Html.ValidationFor(model => model.OldPassword)

你应该看到验证错误