2010-05-05 92 views
1

我已經尋找像一個傻瓜,但沒有得到它要聰明得多..MVC 2的驗證和Entity Framework

在項目中,我使用實體框架4和POCO自己的類和我想用DataAnnotations進行驗證。那裏沒問題,網上有多少時間關於我如何做。但是,我覺得最好在ViewModel中進行驗證,而不是讓我的視圖使用我的POCO類來顯示數據。 我應該如何順利地做到這一點?由於我的資料庫從我的POCO類返回obejekt我試圖用AutoMapper得到的一切工作,但是當我嘗試更新或更改任何ModelState.IsValid是假所有的時間..

我的英語實在是太差了,嘗試表明我今天怎麼做,而不是: 我的POCO

public partial User { 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
} 

我的視圖模型

public class UserViewModel { 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Required")] 
    public string UserName { get; set; } 

    [Required(ErrorMessage = "Required")] 
    public string Password { get; set; } 
} 

控制器:

public ActionResult Edit(int id) { 
    User user = _userRepository.GetUser(id); 
    UserViewModel mappedUser = Mapper.Map<User, UserViewModel>(user); 

    AstronomiGuidenModelItem<UserViewModel> result = new AstronomiGuidenModelItem<UserViewModel> { 
     Item = mappedUser 
    }; 

    return View(result); 
} 

[HttpPost] 
public ActionResult Edit(UserViewModel viewModel) { 
    User user = _userRepository.GetUser(viewModel.Id); 
    Mapper.Map<UserViewModel, User>(viewModel, user);  

    if (ModelState.IsValid) { 
     _userRepository.EditUser(user); 

     return Redirect("/"); 
    } 

    AstronomiGuidenModelItem<UserViewModel> result = new AstronomiGuidenModelItem<UserViewModel> { 
     Item = viewModel 
    }; 

    return View(result); 
} 

我注意到現在我的驗證工作正常,但是當我嘗試發送和更新數據庫時,我的值爲空。我有一個看起來像這樣的主視圖模型:

public class AstronomiGuidenModelItem<T> : AstronomiGuidenModel { 
    public T Item { get; set; } 
} 

爲什麼[R我「UserViewModel視圖模型」空,然後我嘗試編輯?

回答

1

如果驗證正在工作,那麼UserViewModel viewModel不應該爲空...或者它是客戶端驗證正在工作,但服務器端不是?

如果是這種情況,可能是因爲生成了HTML。

舉例來說,如果在你看來,你有:

<%: Html.TextBoxFor(x => x.Item.UserName) %> 

是獲取呈現也可能會被下面的HTML:

<input name="Item.UserName" id="Item_UserName" /> 

當此獲取對服務器上的約束力,但它需要你的動作參數被命名爲與輸入的前綴(Item)相同。例如。

public ActionResult Edit(UserViewModel item) { 

爲了解決這個問題,如上面做,你的動作參數更改爲item或者你可以封裝形式到一個單獨的PartialView更是把UserViewModel,因爲它是模型 - 這樣的Html.TextBoxFor不會被渲染一個前綴。

HTHS,
查爾斯

詩篇。如果我完全偏離軌道,可否請您發佈一些視圖代碼。

+0

我發現這個愚蠢的問題,'UserViewModel'應該是'AstronomiGuidenModelItem '。 – 2010-05-07 10:19:58