tco*_*ode 18 partial-classes viewmodel data-annotations asp.net-mvc-3
我正在使用Entity Framework 4.1开发一个ASP.Net MVC 3 Web应用程序,我对使用数据注释进行表单验证感到困惑.我总是将ViewModel返回给View而不是传递实际对象,因为我意识到这是不好的做法.例如:
public class ViewModelTeam
{
public Team Team { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的观点可能会有这样的东西
@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>
Run Code Online (Sandbox Code Playgroud)
为了验证这个View,我在部分类中创建了数据注释,就像这样
[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; }
Run Code Online (Sandbox Code Playgroud)
然后在我的创建控制器中我有这个
[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);
}
Run Code Online (Sandbox Code Playgroud)
现在,这样可以正常工作,但是,我阅读的ViewModel和验证越多,看起来应该验证的ViewModel就越多,因为在一天结束时,ViewModel正在View中显示而不是对象.
因此,我将ViewModel更改为如下所示
public class ViewModelListItem
{
public int teamID { get; set; }
[DisplayName("Item Name")]
[Required(ErrorMessage = "Please enter a Team Name")]
public string description { get; set; }
Run Code Online (Sandbox Code Playgroud)
我还将我的创建控制器更改为此
[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);
}
Run Code Online (Sandbox Code Playgroud)
再次,这是有效的,但我只是觉得第二种方法有点凌乱或者在第一种方式下效率不高.
我很想听听别人对此的看法.谢谢你的帮助,我为这么长的帖子道歉.
Dar*_*rov 11
我总是使用视图模型和AutoMapper来帮助我简化域和视图模型之间的映射.
查看模型:
public class TeamViewModel
{
[DisplayName("Team Name")]
[Required(ErrorMessage = "Please enter a Team Name")]
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后是一个常用的模式:
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");
}
}
Run Code Online (Sandbox Code Playgroud)