我有一个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
表单时,需要填写City
和create
字段。但是,一个新的开发引入了字段AirportCode
,它改变了需求。基本上,如果给出机场代码值,则不需要其他值。如果没有,地址行1和城市值仍然是两者。如果用户忽略了填写任何表单,我希望所有三个字段都显示错误消息,直到City
和AddressLine1
值或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
开始填写,我可能会在以后想要将其他字段变灰。它与验证没有严格的关系,但它可能与此相关吗?
答案 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库,提供基于注释的功能 条件验证机制。鉴于属性允许忘记 关于验证的逐步验证的必要方式 在许多情况下的条件。由于字段验证要求是 作为元数据应用,与域相关的代码更加精简。