繁体   English   中英

如何使用 .NET Core 在 AutoMapper 中检查 null 属性

[英]How to check null properties in AutoMapper using .NET Core

我有 2 个类 SMSModel,SMSRequest。 我创建了 AutoMapper 并在 Azure Function HTTP 触发器中启动。

Step1:下面安装NuGet Package。

AutoMapper.Extensions.Microsoft.DependencyInjection

第2步:

在 azure function 启动时启动了来自不同程序集的 AutoMapper 配置文件。

services.AddAutoMapper(Assembly.GetAssembly(typeof(AutoMapperProfile)));

3 步:创建了 2 个属性很少的类。

public class SMSModel
    {
        public string MobileNumber { get; set; }

        public string UserId { get; set; }

        public string Code { get; set; }

        .
        .
        .
        .
    }
public class SMSRequest
    {
        [Required(AllowEmptyStrings = false, ErrorMessage = "The 'MobileNumber' field is required.")]
        [JsonProperty("MobileNumber")]
        public string MobileNumber { get; set; }

        [Required(AllowEmptyStrings = false, ErrorMessage = "The 'UserId' field is required.")]
        [JsonProperty("UserId ")]
        public string UserId { get; set; }

[Required(AllowEmptyStrings = false, ErrorMessage = "The 'Code' field is required.")]
        [JsonProperty("Code ")]
        public string Code { get; set; }

        .
        .
        .
        .
    }

第 4步:将请求和 Model 类映射到自动映射器配置文件 class 中的映射器。

public class AutoMapperProfile : Profile
    {
        public AutoMapperProfile()
        {
            CreateMap<SMSRequest, SMSModel>();
              // .ForMember(dest => dest.MobileNumber, act => act.Condition(src => src.MobileNumber != null ));
        }
       
    }

Step5:在 HTTP 触发器 Function c# 中注入 Automapper。分享部分代码。

        private readonly IMapper _mapper;

        public SMSHTTPTrigger(
            ILogger<SMS> logger, 
            IMapper mapper)
        {
            this._logger = logger;
            this._mapper = mapper;
        }

      public async Task<IActionResult> SendSMS(
            [HttpTrigger(
            AuthorizationLevel.Function, "post", Route = null)]
            HttpRequest req)
        {
                string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
                SMSRequest data = JsonConvert.DeserializeObject<SMSRequest>(requestBody);
                var smsModelData = _mapper.Map<SMSModel>(data);

               // Here I want to list all properties (fields) which are having null or empty string without checking each property manually like as below ..

               if(string.IsNullOrEmpty(smsModelData.MobileNumber)
               {
               }

        }

我尝试.ForMember with condition但徒劳无功。

是否可以使用 AutoMapper 检查 null 或空字符串的字段?

目标是仅找出 Null 个属性。 因此使用扩展作为替代方案,它在没有 Automapper 的情况下对我有用。

分机 Class:

public static class HttpRequestValidationExtension
    {
        public static bool IsValid(this object o, out ICollection<ValidationResult> validationResults)
        {
            validationResults = new List<ValidationResult>();
            return Validator.TryValidateObject(o, new ValidationContext(o, null, null), validationResults, true);
        }
    }


string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
SMSRequest data = JsonConvert.DeserializeObject<SMSRequest>(requestBody);

if (!data.IsValid(validationResults: out var validationResults))
                {
                   //Incase if want to loop for each property 
                    foreach (var failure in validationResults)
                    {
                        string message = failure.MemberNames.FirstOrDefault() + " Message" + failure.ErrorMessage;
                        //Console.WriteLine("Property " + memberName + " failed validation. Error was: " + failure.ErrorMessage);
                    }

                   //Single line code  statement to fetch all null properties

                    string invalidrequestErrorMessage = $" Invalid Request body. Please check these errors. {string.Join(" ", validationResults.Select(s => s.ErrorMessage))}";
                    var badrequestObject = new
                    {
                        StatusCode = 400,
                        ErrorDetails = new
                        {
                            FunctionName = nameof(SendSMS),
                            ErrorMessage = invalidrequestErrorMessage
                        }
                    };
                    return new BadRequestObjectResult(badrequestObject);
                }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM