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

M.A*_*zad 0 c# validation asp.net-mvc-3

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

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

在 MVC 视图中我有

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

在我的 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>
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*ter 7

您可以添加一个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);
}
Run Code Online (Sandbox Code Playgroud)

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

    [RequiredGuid]
    public Guid MessageId { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

{
    "errors": {
        "MessageId": [
            "MessageId is required."
        ]
    },
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "0HLQ5JBI08329:00000009"
}
Run Code Online (Sandbox Code Playgroud)


Tr1*_*tan 5

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

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

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

或者

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

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

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