1

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

感谢您的任何建议。

4

1 回答 1

1

MVC 3 中有一个模型验证改进,这将使您能够根据彼此相关的属性检查验证

因此,通过使用 .NET 4 内置的 IValidatableObject 接口在类上实现自定义验证方法。此方法可以跨多个属性应用验证规则并返回多个验证错误,

你看过吗?

模型验证改进部分

于 2011-11-15T03:25:24.857 回答