我使用MVC3,在代码的某些位置,我使用System.ComponentModel.DataAnnotations.DataType.EmailAddress
属性,并让mvc模型验证为我做验证。
然而,我现在想在我不使用模型的代码的不同部分验证电子邮件地址。我想使用MVC已经使用的相同方法,但是我无法找到有关如何这样做的任何信息。
EDIT -抱歉,如果我的问题不清楚。我将尽力澄清。
以下是默认MVC模板中包含的RegisterModel代码片段:
public class RegisterModel
{
...
[Required]
[DataType(DataType.EmailAddress)]
[DisplayName("Email address")]
public string Email { get; set; }
...
}
这些属性指示mvcs模型验证如何验证这个模型。
但是,我有一个应该包含电子邮件地址的字符串。我想验证电子邮件地址相同的方式 mvc正在做它。
string email = "noone@nowhere.com";
bool isValid = SomeMethodForValidatingTheEmailAddressTheSameWayMVCDoes(email);
正如其他人所说,DataType属性实际上不做任何验证。我建议你看看数据注释扩展,它包含了已经为各种事情编写的验证扩展,包括电子邮件。
也可以显式地对整个模型进行模型验证:使用数据注释进行手动验证。
如果您想对特定字段/属性进行每个属性验证,您还可以查看DataAnnotationExtensions的测试,它应该会给您想要的:
[TestMethod]
public void IsValidTests()
{
var attribute = new EmailAttribute();
Assert.IsTrue(attribute.IsValid(null)); // Don't check for required
Assert.IsTrue(attribute.IsValid("foo@bar.com"));
..
}
看一下Scott Guthrie的这篇博文,它展示了如何使用自定义属性(基于regulareexpression attribute)实现对电子邮件地址的验证。
如果您需要在其他地方验证电子邮件地址,则可以重用该逻辑。
您可能想看看这个问题:DataTypeAttribute验证在MVC2中工作吗?
总而言之,[DataType(DataType.EmailAddress)]
实际上并没有验证任何,它只是说"嘿,这个属性应该是一个电子邮件地址"。像Html.DisplayFor()
这样的方法将检查这一点并将其渲染为<a href="mailto:foo">foo</a>
,但IsValid()
方法几乎是一个简单的return true;
。
您将不得不滚动自己的代码来实际执行验证。上面链接的问题有一些示例代码,您可以使用它们作为起点。