MVC3动态DataAnnotation属性StringLength

时间:2011-09-07 14:36:20

标签: asp.net-mvc-3 entity-framework-4 data-annotations

更新#3:完整的问题

我有一个班级HB:

    public class HB
{
    public int Id { get; set; }

    [StringLength(3000)]
    public string Text { get; set; }
    public Title Title { get; set; }

}

标题:

    public class Title
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int MaxChar { get; set; }   
}

在编写HB(这是一篇文章)之前,您必须选择标题,因此可以确定HB.Text的StringLength。意思是,这篇文章只能有一定数量的字符,这取决于作者的“标题”。示例:Title1只能写一个带有1000个字符的'HB',而Title2可以写一个带有3000个字符的'HB'。所以。这意味着StringLength必须来自Title.MaxChar。什么是最聪明的方法呢?

标题实体是将存储在数据库中的前缀数据。

为了清楚起见,我想要达到的目标是:[StringLength(Title.MaxChar)]

我已经在Webforms中完成了这个机制的结构/设计一百万次,我的大脑不能接受mvc,所以一些帮助将不胜感激。代码会更受欢迎。

1 个答案:

答案 0 :(得分:1)

非常确定这是不可能的。当我试图将业务逻辑强制进入属于控制器的模型时,这让我感到震惊。

在这种情况下,我会在Text属性[StringLength(3000)]上创建属性。在控制器中,在验证过程中,我会按照以下几点写出一些内容:

public ActionResult (HB model)
{
    if (model.Text.Length > model.Title.MaxChar){
        ModelState.AddModelError("Text", string.Format("Text for this Title cannot exceed {0} characters.", model.Title.MaxChar));
    }

    if (ModelState.IsValid) 
    {
        //do stuff
        return RedirectToAction("Index"); //or something
    } 
    else 
    {
        return View(model);
    }
}

我相信这将完成你想要做的事情。现在,对于Title对象,我在你的模型中将其弄平:

public class HB
{
    #region Base Properties

    public int Id { get; set; }

    [StringLength(3000)]
    public string Text { get; set; }

    #endregion

    #region Title Properties

    public int TitleId { get; set; }
    public string TitleName { get; set; }
    public int TitleMaxChar { get; set; }

    #endregion
}

这假设您需要在视图中显示该信息。如果您只需要为业务逻辑验证引用它,只需拥有TitleId属性,并在需要时使用它来实例化控制器中的Title对象。如果这些属性不可编辑,请不要忘记为每个属性创建隐藏输入!