枚举数据类型转换为字符串

时间:2018-11-18 16:55:54

标签: c# asp.net-mvc class

如何将枚举数据类型从int转换为string?

这是我的下面的代码

public class Users_Accounts
{
    [Key]
    public int AccountID { get; set; }
    public Guid UniqueID { get; set; }

    [EnumDataType(typeof(string), ErrorMessage = "{0} Opps")]
    public Title Title { get; set; }
    public string First_Name { get; set; }
    public string Last_Name { get; set; }
}

这是我的Title枚举:

public enum Title
{
    Mr, Mrs, Miss, Chief 
}

我收到错误

  

InvalidCastException:无法将类型为“ System.String”的对象转换为类型为“ System.Int32”。

我知道枚举是强类型并且具有int值,并且在我的数据库中它的nvarchar(20)

如何转换?

非常感谢

2 个答案:

答案 0 :(得分:1)

我将为您提供一个示例,您可以尝试,但是这只是一个快速的解决方案,因为您没有设计数据库结构。

枚举项:

public enum Title
{
    Mr, 
    Mrs, 
    Miss, 
    Chief 
}

默认情况下,Title.Mr的默认值应为0Mrs的默认值应为1 ...,与其他版本相同。

如果枚举中包含256个或更少的项,则可以尝试:

public enum Title : byte
{
    Mr = 0, 
    Mrs = 1, 
    Miss = 2, 
    Chief = 3
}

Title.Mr仍具有值0

实体:

public class Users_Accounts
{
    [Key]
    public int AccountID { get; set; }
    public Guid UniqueID { get; set; }

    //You can change the returned type of `Title` property from `Title` to `string` here
    public string Title { get; set; }
    public string First_Name { get; set; }
    public string Last_Name { get; set; }
}

模型:

public class AddUserViewModel
{
    public Title Title { get; set; }
    public string First_Name { get; set; }
    public string Last_Name { get; set; }
}

更新到数据库时,需要将枚举转换为字符串:

public IActionResult AddUser(AddUserViewModel model)
{
    // title contains value like: 0, 1, 2... as string
    string title = ((int)model.Title).ToString();

    var user = new Users_Accounts
    {
        AccountID = ...
        UniqueID = ...
        Title = title,
        First_Name = model.First_Name,
        Last_Name = model.Last_Name
    };

    _dbContext.UserAccounts.Add(user);

    _dbContext.SaveChanges();
}

获得一些用户后,可以将Title作为字符串转换为枚举:

var user = _dbContext.UserAccounts.SingleOrDefault(x => x.AccountID == 1);
Title userTitle = (Title)Convert.ToInt32(user.Title);

userTitle将返回Title.MrTitle.Mrs ...

注意::如果您决定使用

public enum Title : byte {}

您需要将Convert.ToInt32更改为Convert.ToByte

答案 1 :(得分:0)

我也在网上找到了它,虽然它的MVC 5将View.Bag更改为View [“ Data”],但它仍然有效

https://www.c-sharpcorner.com/article/different-ways-bind-the-value-to-razor-dropdownlist-in-aspnet-mvc5/