Asp.net 在模型绑定器启动(使用DateTime)之前,使用数据注释和Linq to SQL验证MVC 2表单

Asp.net 在模型绑定器启动(使用DateTime)之前,使用数据注释和Linq to SQL验证MVC 2表单,asp.net,linq-to-sql,validation,asp.net-mvc-2,data-annotations,Asp.net,Linq To Sql,Validation,Asp.net Mvc 2,Data Annotations,我使用LINQtoSQL和MVC2进行数据注释,在验证某些类型时遇到了一些问题 例如: [DisplayName("Geplande sessies")] [PositiefGeheelGetal(ErrorMessage = "Ongeldige ingave. Positief geheel getal verwacht")] public string Proj_GeplandeSessies { get; set; } 这是一个整数,我正在验证从表单中获取一个正数 public cla

我使用LINQtoSQL和MVC2进行数据注释,在验证某些类型时遇到了一些问题

例如:

[DisplayName("Geplande sessies")]
[PositiefGeheelGetal(ErrorMessage = "Ongeldige ingave. Positief geheel getal verwacht")]
public string Proj_GeplandeSessies { get; set; }
这是一个整数,我正在验证从表单中获取一个正数

public class PositiefGeheelGetalAttribute : RegularExpressionAttribute {
    public PositiefGeheelGetalAttribute() : base(@"\d{1,7}") { }
}
现在的问题是,当我在输入中写入文本时,我看不到这个错误,但我从modelbinder中得到错误消息,说“值‘明天’对Geplande会话无效。”

控制器中的代码:

[HttpPost]
public ActionResult Create(Projecten p)
{
    if (ModelState.IsValid)
    {
        _db.Projectens.InsertOnSubmit(p);
        _db.SubmitChanges();

        return RedirectToAction("Index");
    }
    else
    {
        SelectList s = new SelectList(_db.Verbonds, "Verb_ID", "Verb_Naam");
        ViewData["Verbonden"] = s;
    }

    return View();
}
我想要的是能够在模型绑定器之前运行数据注释,但这听起来几乎不可能。我真正想要的是我自己写的错误信息显示在屏幕上

我对DateTime也有同样的问题,我希望用户以特定的形式“dd/MM/yyyy”编写DateTime,我有一个正则表达式。但是,当数据注释完成它们的工作时,我得到的只是一个DateTime对象,而不是原始字符串。因此,如果输入不是日期,正则表达式甚至不会运行,因为数据注释只是得到一个空值,因为模型绑定器无法将其设置为日期时间

有人知道如何实现这一点吗?

有两种选择:

(1) 您可以创建一个所有字段都是字符串的Projecten viewModel。这样,viewModel将始终从发布的数据中创建,并且您的dataannotations验证将始终得到评估。显然,您可以使用AutoMapper将viewModel映射到正确类型的业务对象


(2) 您可以对模型绑定器进行子类化。

您确定该属性真的是字符串吗?该消息来自格式转换错误,如果您的属性是int,但输入值不兼容(非数字),则该错误很常见。是的,错误来自格式转换错误。这就是为什么我希望在从模型绑定器转换之前运行验证。我的问题正是你所解释的。但是如果我将模型中的所有内容都设置为字符串,那么之后如何才能将所有内容干净地放入数据库中呢?另外,我对MVC、Linq到SQL以及整个DB到类系统都是非常陌生的。我真的很喜欢它的工作方式,但有时我需要大量的谷歌搜索才能找到一些东西。这一个我无法单独解决。当我将日期时间设为字符串时,我得到了这个错误,因此,我需要更多信息:)错误9 DBML1005:不支持类型为“Projecten”的“Proj_goedkurdatum”列中的DbType“Date”和类型“System.String”之间的映射。0 0I最终使用Autobinder创建了一个viewmodel,其中只包含int和datetime的字符串。然后,我在新的viewmodel上使用用于Projecten的数据注释验证程序。在所有这些之后,我只是将其解析回Projecten对象并提交它。但我确实花了一些时间才弄明白:)