我正在使用Entity Framework 4.1开发一个ASP.Net MVC 3 Web应用程序,对于使用Data Annotations进行表单验证,我感到有些困惑。
我总是返回一个viewmodel到一个视图,而不是传递实际的对象,因为我意识到这是不好的做法。例如:
我总是返回一个viewmodel到一个视图,而不是传递实际的对象,因为我意识到这是不好的做法。例如:
public class viewmodelTeam { public Team Team { get; set; } }
我的视图可能会有这样的东西
@model UI.viewmodels.viewmodelTeam @Html.HiddenFor(model => model.Team.teamID) <div class="editor-label"> @Html.LabelFor(model => model.Team.description) </div> <div class="editor-field"> @Html.EditorFor(model => model.Team.description) @Html.ValidationMessageFor(model => model.Team.description) </div>
要验证此视图,我已经在这样的部分类中创建了数据注释
[MetadataType(typeof(TeamMetaData))] public partial class Team { public class TeamMetaData { [DisplayName("Team Name")] [required(ErrorMessage = "Please enter a Team Name")] public object description { get; set; }
然后在我的创建控制器我有这个
[HttpPost] public ActionResult Create(Team team) { if (ModelState.IsValid) { //Add team and redirect } //Got this far then errors have happened //Add Model State Errors viewmodelTeam viewmodel = new viewmodelTeam { Team = team }; return View(viewmodel); }
现在,这样做不错,但是,我阅读的关于viewmodels和验证的内容越多,它似乎是应该被验证的viewmodel,因为在一天结束的时候,viewmodel被显示在视图中,而不是对象。
因此,我将viewmodel更改为如下所示
public class viewmodelListItem { public int teamID { get; set; } [DisplayName("Item Name")] [required(ErrorMessage = "Please enter a Team Name")] public string description { get; set; }
而且我也改变了我的创建控制器
[HttpPost] public ActionResult Create(Team team) { if (ModelState.IsValid) { //Add team and redirect } //Got this far then errors have happened //Add Model State Errors viewmodelTeam viewmodel = new viewmodelTeam(); viewmodel.description = team.description; return View(viewmodel); }
再次,这是有效的,但我只是得到感觉第二种方法是有点凌乱或没有效率的第一种方式这样做。
我有兴趣听别人的想法。谢谢你的帮助,对于这么长的职位我很抱歉。
解决方法
我总是使用视图模型和
AutoMapper来帮助我简化我的域和视图模型之间的映射。
查看型号:
public class Teamviewmodel { [DisplayName("Team Name")] [required(ErrorMessage = "Please enter a Team Name")] public string Description { get; set; } }
然后一个常用的模式:
public class TeamsController: Controller { public ActionResult Create() { var model = new Teamviewmodel(); return View(model); } [HttpPost] public ActionResult Create(Teamviewmodel model) { if (!ModelState.IsValid) { return View(model); } Team team = Mapper.Map<Teamviewmodel,Team>(model); Repository.DoSomethingWithTeam(team); return RedirectToAction("Success"); } }