Mvc ModelState KeyFor属性

时间:2011-11-14 10:09:31

标签: c# asp.net-mvc-3 validation modelstate

每当有一些自定义验证或任何摆弄ModelState时,我都必须依赖魔术字符串(反映属性名称)到目前为止。当然必须有更好的方法。

说你有一个带有2个提交按钮的表单。您已经通过添加必需属性设置了验证规则:

public class MyModel
{
    [Required]
    public string ValueOne { get; set; }
    [Required]
    public string ValueTwo { get; set; }
}

这将始终验证这两个字段。但是我说我已经在上面的模型显示和编辑器的表单中添加了两个按钮。按钮1只需要ValueOne,按钮2只需要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,其中包含表示提交按钮名称的常量字符串。不,我不能把它分成多种形式,因为视图是渲染的。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

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

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

你看看了吗?

Model Validation Improvements part