C# 覆盖字符串属性问题
只是一些关于我申请的背景资料。我正在开发一个ASP.NETMVC3Web应用程序,它使用EntityFramework4.1进行数据持久化。我的应用程序是分层的,因为它有一个UI层、服务层、存储库层等。我还使用Unity来反转控制容器 当用户在我的应用程序上注册时,我使用StringBuilder创建两个随机代码(电子邮件和移动验证代码)。然后,我将这两个随机代码分配给用户对象中相应的属性,如下所示C# 覆盖字符串属性问题,c#,asp.net-mvc-3,entity-framework,C#,Asp.net Mvc 3,Entity Framework,只是一些关于我申请的背景资料。我正在开发一个ASP.NETMVC3Web应用程序,它使用EntityFramework4.1进行数据持久化。我的应用程序是分层的,因为它有一个UI层、服务层、存储库层等。我还使用Unity来反转控制容器 当用户在我的应用程序上注册时,我使用StringBuilder创建两个随机代码(电子邮件和移动验证代码)。然后,我将这两个随机代码分配给用户对象中相应的属性,如下所示 User validateUser = new User(); validateUser.fi
User validateUser = new User();
validateUser.firstName = model.firstName.Trim();
validateUser.lastName = model.lastName.Trim();
validateUser.email = model.Email.Trim();
//Create Email and Mobile Verification Codes
string randomEmailCode = "";
randomEmailCode = _notifyService.GenerateEmailCode();
validateUser.emailVerificationCode = randomEmailCode;
string randomMobileCode = "";
randomMobileCode = _notifyService.GenerateMobileCode();
validateUser.mobileVerificationCode = randomMobileCode;
通知服务
public string GenerateEmailCode()
{
StringBuilder builder = new StringBuilder();
builder.Append(RandomString(4, true));
builder.Append(RandomNumber(1000, 9999));
builder.Append(RandomString(2, false));
return builder.ToString();
}
public string GenerateMobileCode()
{
StringBuilder builder = new StringBuilder();
builder.Append(RandomString(3, true));
builder.Append(RandomNumber(1000, 9999));
builder.Append(RandomString(2, false));
return builder.ToString();
}
private int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}
private string RandomString(int size, bool lowerCase)
{
StringBuilder builder = new StringBuilder();
Random random = new Random();
char ch;
for (int i = 0; i < size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}
if (lowerCase)
return builder.ToString().ToLower();
return builder.ToString();
}
现在,当我进入数据库并找到已添加的新用户时,emailVerificationCode和mobileVerificationCode都是相同的。但是,如果我在代码的下面一行放一个断点
randomEmailCode = _notifyService.GenerateEmailCode();
并一直跟踪到保存,然后检查数据库中是否有新用户,emailVerificationCode和mobileVerificationCode的代码与预期的不同
我无法理解为什么在运行应用程序时,它会为两个属性插入相同的代码
有人能帮忙吗
谢谢
更新
我按照简的建议做了,即像这样为每个属性输入硬编码值
validateUser.emailVerificationCode = "emailCode";
validateUser.mobileVerificationCode = "mobileCode";
再次运行应用程序,这次按预期插入了两个硬编码值。这是否意味着我的两个方法GenerateEmailCode()和GenerateMobileCode()工作不正常?生成这些随机代码的方式可能有问题。 正如其他人所指出的,问题很可能是您创建的random类的实例在时间上过于接近 尝试声明静态随机生成器:
static Random r = new Random();
然后使用静态随机生成代码:(生成代码的方式显然取决于您,但类似的内容应该会让您有所了解):
我得到两个不同的值
所以这两个代码只是在调试时不同?嗯,好吧,这很奇怪。您确定问题不在其他地方吗?因为这看起来很好。。你能试试这个吗:只需为电子邮件输入一个硬编码值,比如“emailCode”,为手机输入一个硬编码值,比如“mobile”?看看当你运行它的时候,它是否复制了其中的一个。如果一切正常,那么一定是生成方法的问题简单的问题-你的随机数/字符串是如何生成的?如果它基于任何时间,那么它将解释为什么它在调试中是不同的,而在没有调试的情况下是相同的。你能为这个随机的。。。方法?你是如何生成这些随机代码的?我猜:你初始化了一个新的随机类。但这将使用时间作为种子,当您运行它时,时间将是相同的,因此“随机”输出也将是相同的。调试时,会引入延迟,从而产生不同的值。@tgriffiths-正如我们所怀疑的,您使用的是
new Random()
,这是导致问题的原因。见我和马腾之前的评论和简·多伊的回答。
static Random r = new Random();
public static string generateCode()
{
string chrs = "abcdefghijklmnopqrstuvwxyz";
char[] arr = chrs.ToCharArray();
string code = "";
for (int i = 0; i < 5; i++)
{
code += arr[r.Next(arr.Count())];
}
return code;
}
var firstCode = generateCode();
var secondCode = generateCode();