我有一个视图和模型,用于记录的编辑和插入页面。业务需求之一是某个字段在编辑时需要,但在新建时不需要。最初,在将此特定功能添加到待办事项中之前,我的模型如下:
[Required(ErrorMessage = "*")]
[Range(0.0, (double)decimal.MaxValue)]
[DisplayName("Cost")]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public decimal ProposedCost { get; set; }
如果是插入表单,我想删除所需的属性;如果是编辑表单,我想添加它。更好的方法是什么?我所有其他验证都是像上面那样完成的。或者我可以改变模型状态吗?想法?
EDIT
我应该澄清的是,他们仍然可以在新产品上插入成本,只是不是必需的。
如果您使用的是 MVC3/.NET4,则可以使用IValidatableObject
专门为此目的而存在。
Quoting ScottGu http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx,
...IValidatableObject 接口使您能够执行模型级
验证,并使您能够提供验证错误消息
具体到整体模型的状态......
你的模型看起来像
public class MyViewModel : IValidatableObject
{
public long? Id { get; set; }
public decimal? ProposedCost { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Id != null && ProposedCost == 0) {
yield return new ValidationResult("ProposedCost must be provided.");
}
}
}
然后在控制器中,
[HttpPost]
public ActionResult Submit(MyViewModel model)
{
if (!ModelState.IsValid) {
//failed - report an error, redirect to action etc
}
//succeeded - save to database etc
}
否则,最干净的解决方案是使用视图模型 -UpdateViewModel
需要该财产的地方,以及CreateViewModel
不需要的地方。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)