代码之家  ›  专栏  ›  技术社区  ›  Stefanvds

在模型绑定器启动(使用日期时间)之前,使用数据注释和LINQ to SQL验证MVC 2表单。

  •  0
  • Stefanvds  · 技术社区  · 15 年前

    我正在使用LINQ to SQL和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();
    }
    

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

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

    1 回复  |  直到 12 年前
        1
  •  2
  •   Paul Hiles    15 年前

    两种选择:

    (1)可以在所有字段都是字符串的情况下生成Projecten ViewModel。这样,将始终从已发布的数据创建ViewModel,并且将始终评估您的DataAnnotations验证。显然,然后您可以使用automapper将视图模型映射到正确类型的业务对象。

    (2)您可以将模型绑定器子类化。