繁体   English   中英

如何在MVC模型中从数据库检索编码的数据并将其解码以显示

[英]How to Retrieve Encoded Data from DB in MVC Model and Decode it for display

我正在使用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.Booking.Add(booking); ,但是在执行db.SaveChanges();会调用此Set {}语句db.SaveChanges(); 并将未加密的数据添加到数据库中,但是以前的加密数据在检索到Display时会正确解码。 尝试解码未加密的数据会导致异常。

问题在于您的媒体资源不平衡:设置时会解码,但不会在任何地方编码。

还要注意,实体框架与您一样使用这些属性 因此,EF调用了吸气剂,该吸气剂获得了_name ,后者是使用_name = Decode(value); 结果:EF永远不会看到编码后的值,它只存在一秒钟的value

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

因此,该属性变为:

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

甚至

public string Name { get; set; }

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

暂无
暂无

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

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