2012-12-21 54 views
0

我使用了這些模型類上我的網站設置頁面:子對象的AddModelError?

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"的密鑰,但這不起作用。

或者,我在這裏採取了錯誤的方法?我應該如何在同一頁面上處理兩種表單?

+0

如果您使用的是由@ Html.EditFor()爲重點,以.AddModelError呈現的輸入元素的「id」屬性的值?還是你? –

+0

您最大的問題是您爲模型類型AccountVM創建了元素,但是您的控制器後期望PasswordVM - 值永遠不會從表單中獲取,因爲輸入元素被命名爲「Password.OldPassword」,但模型聯編程序僅查找「舊密碼」。您應該更改EditPassword以接收AccountVM類型的參數,然後使用它的密碼屬性。 –

回答

1

您可以使用部分視圖。在Account.cshtml

1)分開用於提交passord形式,並且把它在一個局部視圖_EditPassword.cshml(通常我把Views\Shared文件夾中的局部視圖)

使用

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

呈現局部視圖在局部視圖_EditPassword.cshtmlAccount.cshtml

2),可以使用

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

,你應該看到驗證錯誤

+0

謝謝,這個作品很棒。 – Oliver