2009-07-16 147 views
19

关于如何在ASP.NET MVC中实现验证的大部分提示似乎围绕模型(在模型和控制器之间构建服务层或使用验证属性装饰模型的属性) 。验证ASP.NET MVC中的ViewModels

在我的应用程序中,我使用ViewModels控制器和视图之间的所有通信。

我有一个名为'EmailAddress'的属性的名为'LoginViewModel'的登录页面的ViewModel。

当用户输入他们的电子邮件地址并点击提交时,此ViewModel被填充并发送到验证电子邮件地址的控制器。

它必须是有效的电子邮件地址,并且用户必须来自向系统注册的域。

什么是一种方便的方式来添加验证?我应该将验证放入ViewModel本身吗?还是应该留在控制器中?

回答

5

“我应该将验证放在ViewModel本身吗?或者它应该留在控制器中“我同意Robert的意见,但我会添加一个插件以实现额外的自动化功能

如果您看一下诸如xVal之类的工具,可以看到例程验证(例如,必填字段,范围,与正则表达式匹配的字符串)可以通过装饰数据类的字段自动完成,事实上,xVal可以自动编写用于例行验证的JavaScript,以便它在客户端执行,而不需要编写任何代码。这个用户是在我们的数据库中注册的域的成员吗?)在模型层本身内部发生服务器端

使用ViewModel习语会给这个方案带来一些挑战我目前的方法是嵌入我的实体对象s在我的视图模型中,例如

public class Contact { 
    [Required] 
    string Name { get; set; } 
} 

public class ContactView { 
    public Contact Contact { get; set; } 
    public string SomeOtherViewProperty { get; set; } 
} 

,然后在控制器,浅验证更新模型时发生的情况:

UpdateModel(contactViewModel.Contact, "Contact"); 

和需要更多信息或更复杂的计算中发生的验证模型层本身的内部。

另一种方法是不嵌入实体对象,而只是在两者之间映射各个字段。我最近意识到一个名为AutoMapper的工具,它自动链接域和视图模型对象之间的字段。它看起来应该支持这种验证方法,尽管我还没有使用它。

+0

伟大的想法,基思!目前我的策略和你一样 - 在ViewModels中嵌入模型。 我想要的是,如果模型和ViewModels都可以用相同的方式实现验证,而且像xVal这样的JS框架可以与任何一个无缝工作。 这将是最灵活的方式。我不认为验证应该与模型完全绑定。 – Jonathan 2009-07-17 01:43:51

3

NerdDinner tutorials显示验证发生在模型的部分类(即Linq to SQL或Entity Framework)中。但是,由于您使用的是视图模型,您可以将验证逻辑放在那里。

验证逻辑不在控制器中。相反,它是从一个检查属性控制器,即ModelState.IsValid迷上

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) { 

    if (ModelState.IsValid) { 

     try { 
      dinner.HostedBy = "SomeUser"; 

      dinnerRepository.Add(dinner); 
      dinnerRepository.Save(); 

      return RedirectToAction("Details", new { id=dinner.DinnerID }); 
     } 
     catch { 
      ModelState.AddModelErrors(dinner.GetRuleViolations()); 
     } 
    } 

    return View(new DinnerFormViewModel(dinner)); 
} 

全部细节在这里:

建立模型
http://nerddinnerbook.s3.amazonaws.com/Part3.htm

这里:

ViewData and ViewModel
http://nerddinnerbook.s3.amazonaws.com/Part6.htm

+0

**注意:**对于更新的NerdDinner,请看这里:http://nerddinner.codeplex.com/SourceControl/changeset/view/ef63780655b0 – 2013-02-21 18:22:01