我像傻瓜一样搜索但是没有那么聪明......
在我的项目中,我使用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然后我尝试编辑?
答案 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,
查尔斯
聚苯乙烯。如果我完全偏离轨道,你能不能为视图发布一些代码。