更新#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,所以一些帮助将不胜感激。代码会更受欢迎。
答案 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
对象。如果这些属性不可编辑,请不要忘记为每个属性创建隐藏输入!