如何验证模型中的Guid类型?

时间:2012-06-12 20:05:05

标签: c# asp.net-mvc-3 validation

我的模型中有一个属性:

 [Required(ErrorMessage = "Select a user!!!")]
 public Guid UserId { get; set; }

在MVC View我有

<td>*@Html.LabelFor(model => model.UserId) :</td>
<td>@Html.DropDownList("UserId", "--Select--")</td> 

在我的html源代码中我有:

<select id="UserId" name="UserId">
<option value="">--Select--</option>
<option value="30afa71d-6983-410a-bb68-26fd2438b969">User A</option>
<option value="b1d81277-72bc-4aa6-8fc4-524cd01d47a4">User B</option>

</select>

如何验证用户选择用户的此属性

3 个答案:

答案 0 :(得分:3)

问题是,一个不可为空的GUID将始终具有默认值Guid.Empty - 即00000000-0000-0000-0000-000000000000 - 因此您所需的验证程序永远不会将该值视为空,或者为null。

解决方案是使UserId属性可以为空:

public Guid? UserId { get; set; }(注意属性类型后的?

public Nullable<Guid> UserId { get; set; }(如果您不想使用速记)

所以你的属性属性看起来像这样:

[Required(ErrorMessage = "Select a user!!!")]
public Guid? UserId { get; set; }

答案 1 :(得分:2)

使用RegularExpression验证属性:

[RegularExpression(@"^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$")]
[Required(ErrorMessage = "Select a user!!!")]
public Guid UserId { get; set; }

答案 2 :(得分:0)

您可以基于RequiredGuidAttribute添加自定义ValidationAttribute,该值不允许Empty Guid值:

public class RequiredGuidAttribute : ValidationAttribute
{
    public RequiredGuidAttribute() => ErrorMessage = "{0} is required.";

    public override bool IsValid(object value)
        => value != null && value is Guid && !Guid.Empty.Equals(value);
}

然后在模型上,可以将属性声明为Guid并进行如下装饰:

    [RequiredGuid]
    public Guid MessageId { get; set; }

当我从请求正文中省略MessageId时,我的ASP.NET Core WebApi然后在Postman中返回以下内容:

{
    "errors": {
        "MessageId": [
            "MessageId is required."
        ]
    },
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "0HLQ5JBI08329:00000009"
}