到目前为止,每当需要进行一些自定义验证或对 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,包含表示提交按钮名称的常量字符串。不,我不能把它分成多种形式,因为视图是渲染的。
感谢您的任何建议。