如何在MVC模型中从DB中检索编码数据并对其进行解码以供显示

时间:2016-11-23 11:27:54

标签: c# asp.net-mvc

我正在使用ASP.NET MVC C#构建Web应用程序。 我正在使用函数编写数据:

public string Encode(string encodeMe)
{
    byte[] encoded = System.Text.Encoding.UTF8.GetBytes(encodeMe);
    return Convert.ToBase64String(encoded);
}

这在类构造函数中调用:

public Booking(string name, string phone, string email, string date)
{
    Name = Encode(name);
    Phone = Encode(phone);
    Email = Encode(email);
    PreferredTime = DateTime.Parse(date);
}

到目前为止一切顺利,加密数据被写入数据库。

但是,当我使用此函数读回数据时,我想解码该数据:

public static string Decode(string decodeMe)
{
    byte[] encoded = Convert.FromBase64String(decodeMe);
    return System.Text.Encoding.UTF8.GetString(encoded);
}

我尝试在Set {}语句中添加这个:

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = Decode(value);
    }
}

现在会发生什么?预订记录由db.Booking.Add(booking);中的构造函数正确编码,但在执行db.SaveChanges();期间调用此Set {}语句,并且未加密的数据被添加到数据库中,但先前加密的数据已正确解码检索显示。尝试解码未加密的数据会导致异常。

1 个答案:

答案 0 :(得分:0)

问题是你的属性是不平衡的:它在设置时解码,但它不会在任何地方编码。

另请注意,实体框架使用这些属性就像您一样。因此,EF调用getter,获取_name,使用_name = Decode(value);设置。结果:EF从未看到编码值,它只在value中存在一瞬间。

为了保证属性中的数据始终被编码,您应该保留编码/解码的属性,如果您需要“真实数据”(例如,在显示时),请自行执行。

所以财产就变成了:

public string Name
{
    get { return _name; }
    set { _name = value; }
}

甚至

public string Name { get; set; }

Booking构造函数中,您在分配属性之前已使用Encode()
在您需要“实际”值的所有其他地方,您需要使用{{1等等。