2012-08-09 57 views
0

從昨天開始,我有此問題。 在我的用戶模型中,我有一個[NotMapped],稱爲「ConfirmPassword」。我不把它保存在數據庫上,但是我在創建表單上將它用作總是爲新用戶驗證數據輸入。所需的ModelValidation僅適用於新對象ASP.NET MVC

因爲比,沒關係。問題出在我的[HttpPost]編輯操作上。我應該可以編輯某些用戶的數據而不用鍵入並確認密碼。如果我想更改密碼,我同時使用Password和ConfirmPassword作爲確認舊密碼的方法並使用新密碼。但是,如果我不做,我就把它們留空。

我都已經使用下面的代碼,以便能夠通過ModelState.IsValid()條件和它的工作:

ModelState["Password"].Errors.Clear(); 
ModelState["ConfirmPassword"].Errors.Clear(); 

但是,就在db.SaveChanges()之前,爲用戶的用戶視圖模型被認爲是,它有兩個屬性空和我:

Property: ConfirmPassword Error: The field ConfirmPassword is invalid. 

的問題是:我怎麼能跳過德必模型驗證時,我想更新對象?

我已經閱讀有關自定義ModelValidations帶班延長ValidationAttributeDataAnnotationsModelValidator,但我沒有這樣做是正確的。

有什麼想法?我如何創建一個自定義模型驗證來檢查UserId屬性是否爲null。這是一個很好的方法來檢查我是否在創建或編輯操作。

感謝, 聖保羅

回答

0

使用域對象作爲你的視圖模型將導致你少的可擴展性的條件。我會選擇視圖的獨立ViewModels。當我必須保存數據時,我將ViewModel映射到Domain模型並保存。在你的speciific情況下,我會創造2周的ViewModels

public class CustomerViewModel 
{ 
    public string FirstName { set;get;} 
    public string LastName { set;get;} 
} 

,我會再來ViewModel繼承從上面的類,爲Create查看

public class CustomerCreateViewModel :CustomerViewModel 
{ 
    [Required] 
    public string Password { set;get;} 

    [Required] 
    public string ConfirmPassword { set;get;} 
} 

現在我找的行動,我使用此視圖模型

public ActionResult Create() 
{ 
    var vm=new CustomerCreateViewModel(); 
    return View(vm); 
} 

,當然我視圖(create.cshtml)現在綁定到TH在視圖模型

@model CustomerCreateViewModel 
<h2>Create Csustomer</h2/> 
//Other form stuff 

同樣,對於我的Edit行動,

public ActionResult Edit(int id) 
{ 
    var vm=new CustomerViewModel(); 
    var domainCustomer=repo.GetCustomerFromID(id); 
    if(domainCustomer!=null) 
    { 
     //This manual mapping can be replaced by AutoMapper. 
     vm.FirstName=domainCustomer.FirstName; 
     vm.LastName=domainCustomer.LastName; 
    } 
    return View(vm); 
} 

這種觀點爲界,CustomerViewModel

@model CustomerViewModel 
<h2>Edit Info of @Model.FirstName</h2> 
//Other form stuff 

在你POST操作,它映射回Domain對象和保存

[HttpPost] 
public ActionResult Create(CustomerCreateViewModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     var domainCust=new Customer(); 
     domainCust.FirstName=model.FirstName; 
     repo.InsertCustomer(domainCust); 
     //Redirect if success (to follow PRG pattern) 
    } 
    return View(model); 
} 

您可以考慮使用AutoMapper庫爲您完成此工作,而不是自己編寫Mapping。

+0

非常感謝Shyju!我認爲這可以節省我:)我的用戶類已經從MembershipUser繼承,但我可以創建一個從用戶繼承的新類。謝謝 – paulofabiano 2012-08-09 13:26:21

+0

但Shyju,使用這個解決方案,我必須有一個編輯視圖爲每個類,對不對? – paulofabiano 2012-08-09 13:33:58

+0

你的意思是ViewModel?如果你想要創建和編輯單獨的驗證,你應該有獨立的ViewModels。但是你可以利用繼承來保持乾爽 – Shyju 2012-08-09 13:38:01

相關問題