如果未填充其他输入,则仅要求输入填充

时间:2017-06-07 10:08:29

标签: asp.net forms validation asp.net-core

我有一个ASP.NET应用程序,要求用户填写表单以创建新对象。它的定义如下:

public class Address
    {
        public int ID { get; set; }
        [Required]
        public string AddressLine1 { get; set; }
        public string AddressLine2 { get; set; }
        public string AddressLine3 { get; set; }
        [Required]
        public string City { get; set; }
        public string Postcode { get; set; }

        public string AirportCode { get; set; }
    }

填写AddressLine1表单时,需要填写Citycreate字段。但是,一个新的开发引入了字段AirportCode,它改变了需求。基本上,如果给出机场代码值,则不需要其他值。如果没有,地址行1和城市值仍然是两者。如果用户忽略了填写任何表单,我希望所有三个字段都显示错误消息,直到CityAddressLine1值或AirportCode值给定,但是我可以担心以后的语义 - 重要的是不要让无效的对象通过。

我猜逻辑将是:

if AirportCode OR (AddressLine1 AND City)

以下是City输入字段的一小部分示例。它是应用程序生成的默认值:

<div class="form-group">
<label asp-for="City" class="col-md-2 control-label">City</label>
    <div class="col-md-10">
        <input asp-for="City" class="form-control" />
        <span asp-validation-for="City" class="text-danger"></span>
    </div>
</div>

有没有办法在不使用JavaScript的情况下实现它?到目前为止,表单验证非常简洁,我希望能够通过框架完成此操作。感谢。

事后的想法:如果AirportCode开始填写,我可能会在以后想要将其他字段变灰。它与验证没有严格的关系,但它可能与此相关吗?

1 个答案:

答案 0 :(得分:1)

您需要编写自己的自定义验证属性。

Howerver有一个名为“ExpressiveAnnotations”的插件,它非常易于使用,可以帮助您在“DataAnnotations”中实现逻辑。

[RequiredIf("AirportCode == null",
    ErrorMessage = "Your error message.")]
public string AddressLine1 { get; set; }

[RequiredIf("AirportCode == null",
    ErrorMessage = "Your error message.")]
public string City { get; set; }

[RequiredIf("City == null")]
[RequiredIf("AddressLine1 == null")]
public string AirportCode { get; set; }

如果您认为它对您的目的有用,可以找到有关ExpressiveAnnotations库的更多信息here。客户端验证也支持开箱即用。

  

一个小型.NET和JavaScript库,提供基于注释的功能   条件验证机制。鉴于属性允许忘记   关于验证的逐步验证的必要方式   在许多情况下的条件。由于字段验证要求是   作为元数据应用,与域相关的代码更加精简。