MVC 2验证和实体框架

时间:2010-05-05 14:27:29

标签: asp.net-mvc-2 poco data-annotations

我像傻瓜一样搜索但是没有那么聪明......

在我的项目中,我使用Entity Framework 4并拥有PoCo类,我想使用DataAnnotations进行验证。没问题,互联网上有多少关于我是怎么做的。但是,我认为最好在ViewModels中进行验证,而不是让我的视图使用我的POCO类来显示数据。 我该怎么办呢?由于我的存储库从我的POCO类中返回obejekt,我尝试使用AutoMapper来使所有内容工作,但是当我尝试更新或更改ModelState.IsValid中的任何内容时始终为false。

我的英语非常糟糕,试着告诉我今天的表现如何: 我的POCO

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

我的ViewModel

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);
}

我现在已经注意到我的验证工作正常,但是当我尝试发送和更新数据库时,我的值为null。我有一个主要的ViewModel,如下所示:

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

为什么我的“UserViewModel viewModel”为null然后我尝试编辑?

1 个答案:

答案 0 :(得分:1)

如果验证工作正常,那么UserViewModel viewModel不应该为空......或者是客户端验证是否有效但服务器端不是?

如果是这种情况,可能是因为生成了HTML。

例如,如果您在视图中有:

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

获得渲染的html可能是:

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

当它在服务器上绑定时,它需要将您的action参数命名为与输入的前缀(Item)相同。 E.g。

public ActionResult Edit(UserViewModel item) {

要解决此问题,请执行上述操作并将操作参数更改为item或者您可以将表单封装到单独的PartialView中,该部分视图将UserViewModel作为其模型 - 这样Html.TextBoxFor赢了“用前缀来渲染。

HTHS,
查尔斯

聚苯乙烯。如果我完全偏离轨道,你能不能为视图发布一些代码。