C# 如何在模型中验证Guid类型?

C# 如何在模型中验证Guid类型?,c#,asp.net-mvc-3,validation,C#,Asp.net Mvc 3,Validation,我的模型中有这样一个属性: [Required(ErrorMessage = "Select a user!!!")] public Guid UserId { get; set; } [Required(ErrorMessage = "Select a user!!!")] public Guid? UserId { get; set; } 在MVC视图中,我有 <td>*@Html.LabelFor(model => model.UserId) :</td&g

我的模型中有这样一个属性:

 [Required(ErrorMessage = "Select a user!!!")]
 public Guid UserId { get; set; }
[Required(ErrorMessage = "Select a user!!!")]
public Guid? UserId { get; set; }
在MVC视图中,我有

<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>
如果用户选择一个用户

使用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; }

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

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

公共Guid?UserId{get;set;}注意到了吗?在属性类型之后

如果不想使用速记,请使用公共可为空的用户标识{get;set;}

因此,您的属性及其属性如下所示:

 [Required(ErrorMessage = "Select a user!!!")]
 public Guid UserId { get; set; }
[Required(ErrorMessage = "Select a user!!!")]
public Guid? UserId { get; set; }
您可以基于ValidationAttribute添加不允许空Guid值的自定义RequiredGuidAttribute:

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"
}

这有什么帮助?数据类型已经是Guid。编译器不会让你把你好,世界!在那里。我认为OP想要验证GUID是否属于有效GUID列表。@EricJ。这是一个很好的观点。mtaboy,您有有效GUID的特定列表吗?