【问题标题】:Mvc ModelState KeyFor propertyMvc ModelState KeyFor 属性
【发布时间】: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


【解决方案1】:

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

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

你看过了吗?

Model Validation Improvements part

【讨论】:

  • 谢谢。我当然会看看以这种方式做事。听起来它应该能够做我需要的事情。我只是跳[e可以将这种方法与内置验证属性结合起来。当我有时间测试它时,我会留下反馈。
猜你喜欢
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2017-02-26
  • 2018-06-23
相关资源
最近更新 更多