【发布时间】:2011-11-14 10:09:30
【问题描述】:
到目前为止,每当需要进行一些自定义验证或对 ModelState 进行任何摆弄时,我都不得不依赖魔术字符串(反映属性名称)。肯定有更好的办法。
假设您有一个带有 2 个提交按钮的表单。您已经通过添加必需属性设置了验证规则:
public class MyModel
{
[Required]
public string ValueOne { get; set; }
[Required]
public string ValueTwo { get; set; }
}
这将始终验证两个字段。但是假设我已经为上述模型的显示和编辑器添加了两个按钮。按钮一只需要ValueOne,按钮二只需要ValueTwo。
Typically I would have custom validation code that checks which button was clicked and do something along the lines:
private void ValidateViewModel(MyModel viewModel)
{
foreach (var key in ModelState.Keys)
ModelState[key].Errors.Clear();
if (Request[{ButtonOneName}] != null && string.IsNullOrEmpty(viewModel.ValueOne))
ModelState.AddModelError("ValueOne", "Required");
else if (Request[{ButtonTwoName}] != null && string.IsNullOrEmpty(viewModel.ValueTwo))
ModelState.AddModelError("ValueTwo", "Required");
}
不是很漂亮,我知道但是......我的牛肉是用魔术字符串“ValueOne”和“ValueTwo”。还有清除错误的方式。有没有办法生成这些密钥?我正在寻找类似的东西:
ModelState.KeyFor<MyModel>(m => m.ValueOne)
然后是逻辑扩展:
ModelState.Get<MyModel>(m => m.ValueOne)
在我开始重新发明轮子之前 - 是否已经在某个地方隐藏了这样的东西?
在您问之前,我通常会定义静态类 SubmitActions,其中包含表示提交按钮名称的常量字符串。不,我不能将它拆分为多个表单,因为视图是渲染的。
感谢您的任何建议。
【问题讨论】:
-
您找到解决方案了吗? ModelState.KeyFor
(m => m.ValueOne) 正是我正在做的类似事情所需要的......
标签: c# asp.net-mvc-3 validation modelstate