2010-05-05 35 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