gpt4 book ai didi

c# - 基于 bool 方法的自定义 MVC4 验证

转载 作者:行者123 更新时间:2023-11-30 13:38:33 24 4
gpt4 key购买 nike

我有一个验证数字的方法,我没有正则表达式,因为它创建起来有点复杂。

public bool IsRegistrationNumberValid(int number)
{
...

}

在我的表单上,我有一个文本框,我想为此列添加验证。如何创建自定义注释或挂接到 ModelState 对象以添加错误消息?

我的 POST Controller Action 是这样的:

    [HttpPost]
public ActionResult Create(UserRegistrationViewData model)
{
if (ModelState.IsValid)
{
...
}
}

我不确定我有哪些选项,我可以只创建一个自定义属性来添加到我的模型中吗?和/或者我是否应该在检查 ModelState.IsValid 之前挂接到模型状态并添加错误消息?

最佳答案

有几种方法可以解决这个问题,最适合您的方法取决于以下几点:

  • 您的 IsRegistrationNumberValid 方法位于何处,是否移动了逻辑?
  • 您是否正在验证用户输入或域的完整性(您应该检查两者,但对每个的验证将在不同的地方进行)?
  • 个人喜好。

在我看来,您有以下可用选项:

  1. 在您的 Controller 操作方法中进行验证。
  2. 使用 IValidatableObject 接口(interface)进行验证。
  3. 使用自定义 ValidationAttribute
  4. 在您的服务层进行验证。

选项 1:在您的 Controller 中验证:

首先,您可以简单地验证 Controller 操作方法中的值并像这样更新 ModelState:

[HttpPost]
public ActionResult Create(UserRegistrationViewData model)
{
if (ModelState.IsValid)
{
if (!someObject.IsRegistrationNumberValid(model.value))
{
ModelState.AddModelError("PropertyName", "There is an error..");
Return View()
}
else
{
// Carry out successful action here...
}
}
}

选项 2:使用 IValidatableObject 接口(interface)。

第二种更简洁的方法是在您的 viewModel 上实现 IValidatableObject 接口(interface),这样您就可以将逻辑移出 Controller :

public class ViewModel : IValidatableObject
{
public int Value { get; set; }

IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
{
if (!staticClass.IsRegistrationNumberValid(this.Value))
{
yield return new ValidationResult("An error occured");
}
}

选项 3:创建自定义验证属性。

如前所述,您可以通过从 ValidationAttribute 派生来创建自定义验证属性 as shown in this article .

IvalidatableObject 接口(interface)和自定义验证属性之间的选择通常取决于偏好,但是,IValidatableObject 接口(interface)获胜的一种情况是您的验证取决于多个属性(例如,检查一个日期是否在另一个日期之后)。

选项 4:在您的服务层中验证。

最后,如果您的验证依赖于数据库中的其他信息,您可能需要查看 validating with a service layer 上的本教程。 .这篇文章并不完美(服务和 Controller 耦合有点过于紧密)但是是一个好的开始并且通过一些修改您可以将数据库验证错误(例如主键违规)以非常透明和用户的方式传递到您的用户界面-友好的方式。

您最终可能会混合使用选项 2、3 和 4。如果可能,您真的不想使用第一个选项,因为它会使您的 Controller 方法更加复杂,并使重用验证变得更加困难别处的逻辑。

我的建议如下:

  • 如果您要验证用户输入的完整性(例如检查日期格式是否正确),请混合使用 IValidatableObject 接口(interface)和 ValidationAttribute 类。
  • 如果您要验证域的完整性(确保没有输入重复的实体,或者实体之间的关系已定义),请在服务层执行验证。

关于c# - 基于 bool 方法的自定义 MVC4 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16043984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com