2011-09-07 77 views
0

更新#3:整个问题MVC3动态DataAnnotation属性StringLength

我有一个类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)]

香港专业教育学院做结构/设​​计,这种机制在Web表单一万次,我的大脑都无法addapt MVC的,所以一些帮助将不胜感激。代码将更受赞赏。

+0

你想做什么?我不清楚。 –

+0

@jeremy,'[StringLength(set_by_view)]' – bzlm

+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); 
    } 
} 

我相信这将完成你正在尝试做的。现在,对于标题的对象,我会拉平说出来有点在你的模型:

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对象。如果这些属性不可编辑,请不要忘记为每个属性设置隐藏的输入!

+0

太棒了。看起来不错。我会尝试一下。 –

+0

顺便说一句,注意到我在代码中存在一个错误;只是修复它。另外,您的模型中的Title对象可能存在问题。在模型中传递复杂对象可能是一种痛苦。考虑仅向标题引用ID,并根据需要从数据存储中获取信息。 –

+0

是的,我注意到了。没问题。但是,标题对象。空引用:S。我用这种方式更新了问题,但是if语句中hb.Title.MaxChar为null。请看看:) –