首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.Net MVC3 ViewModel数据标注

ASP.Net MVC3 ViewModel数据标注
EN

Stack Overflow用户
提问于 2012-03-27 21:57:53
回答 1查看 15K关注 0票数 18

我正在使用Entity Framework4.1开发一个ASP.Net MVC3Web应用程序,对于使用数据注解进行表单验证,我感到有点困惑。我总是将ViewModel返回给视图,而不是传递实际的对象,因为我意识到这是一种糟糕的做法。例如:

代码语言:javascript
复制
public class ViewModelTeam
{
    public Team Team { get; set; }
}

我的视图可能会有类似下面这样的内容

代码语言:javascript
复制
@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>

为了验证这个视图,我在一个分部类中创建了数据注释,如下所示

代码语言:javascript
复制
[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; }

然后在我的create Controller中,我有这个

代码语言:javascript
复制
[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,如下所示

代码语言:javascript
复制
public class ViewModelListItem
{

    public int teamID { get; set; }

    [DisplayName("Item Name")]
    [Required(ErrorMessage = "Please enter a Team Name")]
    public string description { get; set; }

我还将我的create Controller修改为

代码语言:javascript
复制
[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);
    }

同样,这是有效的,但我只是感觉第二种方法有点混乱,或者在第一种方法中效率不高。

我很有兴趣听听别人对此的看法。谢谢你的帮助,我为这么长的帖子道歉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-27 22:00:58

我总是使用视图模型和AutoMapper来帮助我简化域和视图模型之间的映射。

查看模型:

代码语言:javascript
复制
public class TeamViewModel
{
    [DisplayName("Team Name")]
    [Required(ErrorMessage = "Please enter a Team Name")]
    public string Description { get; set; }
}

然后是一个常用的模式:

代码语言:javascript
复制
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");
    }
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9891040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档