簡體   English   中英

asp.net核心枚舉Nullable對象必須具有一個值

[英]asp.net core Enum Nullable object must have a value

我有以下enum

public enum EventType
        {
            LoginSuccessfully = 1,
            LoginFailure = 2,
            UserCreated = 3,
            UnableToCreateUser = 4,
            PasswordReseted = 5,
            UnableToResetPassword = 6,
            UserDeleted = 7,
            UnableToDeleteUser = 8
        }

我有這種方法:

public IActionResult GetFilteredLogs([FromBody] SearchFilterContract contract)
{
    //filter logs from database
}

這是從我的方法中作為parameter接收的contract

 public class SearchFilterContract
    {
        public EventType? EventTypes { get; set; }
        public string Username { get; set; }
        public DateTime? fromDate { get; set; }
        public DateTime? toDate { get; set; }
        public int pageSize { get; set; }
        public int pageNumber {get; set;}

    }

如果contract中的所有值均為Null ,則從數據庫中獲取所有值。

在我的方法上,我比較合同的變量

public SearchStatementSource(int? EventId,string username,DateTime? fromDate,DateTime? toDate,int pageSize, int PageNumber)

{
            StringBuilder sb = new StringBuilder();
 sb.AppendLine("SELECT * FROM [dbo].[eventslog] ");

            if(username != null)
            {
                sb.AppendLine("WHERE Username = @Username ");
            }
            else 
            {
                sb.AppendLine("WHERE Username IS NOT NULL ");
            }

            if(fromDate.HasValue)
            {
                sb.AppendLine("AND CreatedTime >= @fromDate ");
            }
            if(toDate.HasValue)
            {
                sb.AppendLine("AND CreatedTime <= @toDate ");
            }
            if(EventId.HasValue)
            {
                sb.AppendLine("AND EventId = @EventId ");
            }
            sb.AppendLine("AND Id >=" + startingIndex);
            sb.AppendLine("AND Id <=" + finalIndex);

            _command = sb.ToString();
Parameters.Add(new SqlParameter("@null","null"));
            AddNullable("@Username", username);
            AddNullable("@EventId", EventId);
            AddNullable("@fromDate", fromDate);
            AddNullable("@toDate",toDate);

詮釋? EventId是從枚舉接收到的數字

這是我的控制器方法:

[HttpPost]
        [Route("[action]")]
        [AllowAnonymous]
        public IActionResult GetFilteredLogs([FromBody] SearchFilterContract contract)
        {
            try
            {
                List<EventsLog> eventsLog = _logsBl.SearchLogs(contract.EventTypes,contract.Username,contract.fromDate,contract.toDate,contract.pageNumber,contract.pageSize);
                return Ok(eventsLog);
            }
            catch(Exception ex)
            {
                return BadRequest(ex);
            }
        }

這是我的DataRepository方法

public List<EventsLog> SearchLogs(EventType? EventId, string username, DateTime? fromDate, DateTime? toDate,int pageSize, int pageNumber)
        {
            List<EventsLog> logs = new List<EventsLog>();
            DataTable dt = Select(new SearchStatementSource((int)EventId,username,fromDate,toDate,pageSize,pageNumber));
            foreach(DataRow dr in dt.Rows)
            {
                logs.Add(Map(dr));
            }
            return logs;
        }

當它調用Repository方法SearchStatementSource方法時,拋出該異常

我的問題是,當我將EventTypes為Null時,它將返回以下錯誤:

“空對象必須具有值”

有想法該怎么解決這個嗎?

您將必須檢查使用EventTypes.Value 所有位置。

那是因為您正在訪問一個空對象的Value屬性。

在小提琴上看到這里

您首先像這樣檢查它:

if(obj.EventTypes.HasValue)
   //Do your logic

或者,如果您使用的是C#6,則可以使用它

obj.EventTypes ?? DefaultValue

更新:

您的問題在這里:

DataTable dt = Select(new SearchStatementSource((int)EventId, username, [...]

EventId可以為null時,您將其轉換為int

將其更改為(int?)EventId

DataTable dt = Select(new SearchStatementSource((int?)EventId, username, [...]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM