【问题标题】:Server Error in '/' Application.Specified cast is not valid“/”应用程序中的服务器错误。指定的转换无效
【发布时间】:2020-01-07 08:15:04
【问题描述】:

我尝试运行此代码并弹出错误,具体转换无效。在添加任何 LINQ 之前做得很好。请帮忙谢谢。在添加任何 LINQ 之前仍然可以。但现在它无法加载用户数据库上下文。我不知道这是怎么发生的。请发送帮助谢谢。

ForumDBDataContext db = new ForumDBDataContext();
protected void Page_Load(object sender, EventArgs e)
{
    ValidationSettings.UnobtrusiveValidationMode = UnobtrusiveValidationMode.None;
}

protected void btnLogin_Click(object sender, EventArgs e)
{
    string emailAddress = txtEmail.Text;
    string password = txtpwd.Text;
    bool rememberMe = chkRememberMe.Checked;

    User u = db.Users.SingleOrDefault(
                x => x.EmailAddress == emailAddress &&
                x.Hash == Security.GetHash(password)
                );

    if (u != null)
    {
        DateTime currentDate = DateTime.Now;
        var query = from m in db.Members
                    where m.EmailAddress == emailAddress
                    select m.Last_Login_Date;

        Convert.ToDateTime(currentDate);
        DateTime lld = Convert.ToDateTime(query);
        int diffDays = DateTime.Compare(currentDate, lld);


        if (diffDays > 72)
        {
            Response.Redirect("ChangePwd.aspx");
        }
        else
        {
            Security.LoginUser(u.Name, u.Role, rememberMe);

        }
    }

【问题讨论】:

  • 你不能在LINQ中使用Security.GetHashmethod,因为这个方法不能被翻译成SQL。
  • 这段代码是在 c# 中完成的,在此之前它可以运行。所以我不认为 Security.GetHash 是问题
  • @HowToGame 你的db.Users 是什么样的?
  • 创建视图 [dbo].[User] AS SELECT [Id],[EmailAddress],[Name],[Hash],[DateJoined], [Last_Login_Date],'Member' AS [Role] FROM [Member] UNION SELECT [Id],[EmailAddress],[Name],[Hash],[DateJoined],[Last_Login_Date],'Admin' AS [Role] FROM [Admin]
  • 我创建了一个视图来结合成员和管理员

标签: c# asp.net linq


【解决方案1】:

您不能在 LINQ 中使用Security.GetHashmethod,因为此方法无法转换为 SQL。您需要在运行 LINQ 之前运行此方法并设置变量:

string emailAddress = txtEmail.Text;
string password = txtpwd.Text;
bool rememberMe = chkRememberMe.Checked;
var hashedPassword = Security.GetHash(password);

User u = db.Users.SingleOrDefault(
            x => x.EmailAddress == emailAddress &&
            x.Hash == hashedPassword 
            );

【讨论】:

  • 你得到什么错误? UserHash 属性的类型是什么?
  • 哈希是加密后的密码。 User 是 UNION Member 和 Admin 的视图。哈希是 char(54),内部用户有 Id、Email_Address、用户名、哈希、Last_Date_Joined、Date_Joined、Profile_Picture
  • 我的意思是IntString之类的类型?
  • 必须将 char due 放在不同的字符和整数上
  • 但我认为这不是问题所在。昨天还不错,但现在它无法处理 UserDBContext。我真的不知道发生了什么
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
相关资源
最近更新 更多