需要一个或另一个字段

时间:2017-04-15 14:38:39

标签: c# asp.net asp.net-mvc validationattribute

基本上我想弄清楚的是如何要求在视图中填写两个字段中的至少一个。

在我的视图中,我有两个名为ISBN和ISBN13的文本字段。只要其中一个用户填写,用户填写哪一个并不重要。

我不确定在这里做什么,期望考虑编写自定义验证器,所以我想我会先问。我会包含一些代码,但因为它只是两个简单的字段,我认为这种解释会更好。

4 个答案:

答案 0 :(得分:6)

您可以在控制器操作中进行手动验证。 AddModelError方法将帮助您使用验证堆栈。

[HttpPost]
public ActionResult Edit(EditModel model)
{
    if (string.IsNullOrEmpty(model.ISBN) && string.IsNullOrEmpty(model.ISBN13))
    {
        var validationMessage = "Please provide ISBN or ISBN13.";
        this.ModelState.AddModelError("ISBN", validationMessage);
        this.ModelState.AddModelError("ISBN13", validationMessage);
    }

    if (!string.IsNullOrEmpty(model.ISBN) && !string.IsNullOrEmpty(model.ISBN13))
    {
        var validationMessage = "Please provide either the ISBN or the ISBN13.";
        this.ModelState.AddModelError("ISBN", validationMessage);
        this.ModelState.AddModelError("ISBN13", validationMessage);
    }

    if (this.ModelState.IsValid)
    {
        // do something with the model
    }

    return this.View(model);
}

有些人可能会说控制器没有责任对查询进行验证。我认为控制器的职责是使Web请求适应域请求。因此,控制器可以具有验证逻辑。如果您没有域/业务层,那么这种考虑是没有意义的。

答案 1 :(得分:3)

使用MVC Foolproof NuGet包,然后您可以使用link.physicsBody = SKPhysicsBody(rectangleOf: link.size) 属性,如下所示:

RequiredIf

答案 2 :(得分:1)

我想在将更改保存到数据库之前,在创建部分中向控制器添加这样的内容。

int countISBN = Product.ISBN.Count() + Product.ISBN13.Count();
if (countISBN <= 9)
{
    // Add in an error message.
    return View();
}

这将做的是计算两个字段中的字符,将它们相加。如果它们的总和低于10,则会产生错误。

答案 3 :(得分:0)

.net 框架:万无一失

.net 核心:FoolProof.Core

[RequiredIfEmpty] 存在于新版本中。例如:

    [RequiredIfEmpty(dependentProperty: "ISBN", DependentPropertyDisplayName = "ISBN", ErrorMessage = "If ISBN is null then ISBN13 is require")]

还有很多其他的属性:

[RequiredIf]
[RequiredIfNot]
[RequiredIfTrue]
[RequiredIfFalse]
[RequiredIfEmpty]
[RequiredIfNotEmpty]
[RequiredIfRegExMatch]
[RequiredIfNotRegExMatch]

点击this link

查看参考