2016-11-16 83 views
-2

我會嘗試在Asp.Net MVC 5(代碼優先)中創建自定義身份驗證和授權。在模型中,我創建了2級,UserAccountUserAccountModelIEnumerable轉換錯誤c#

我有

return listAccounts.Where(acc => acc.UserName.Equals(username)); 

錯誤代碼是不是英文的,但像這樣在UserAccountModel的錯誤: 是不可能的隱式轉換IEnumerable到列表中,請使用演員表

如何解決該問題?感謝

//------------------------------- 
//UserAccont.cs 
//------------------------------- 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 

namespace MvcSia.Models 
{ 
    public class UserAccont 
    { 
     [Key] 
     public int UserId { get; set; } 

     [Required(ErrorMessage ="Choose a name")] 
     public string Name{ get; set; } 

     [Required(ErrorMessage ="Choose surname")] 
     public string Surname{ get; set; } 

     [Required(ErrorMessage ="Email required")] 
     [RegularExpression(@"^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$", ErrorMessage = "Invalid email")] 
     public string Email { get; set; } 

     [Required(ErrorMessage = "User Name required")] 
     public string UserName { get; set; } 

     [Required(ErrorMessage = "User type required")] 
     public string UserType { get; set; } 

     [Required(ErrorMessage = "Password required")] 
     [DataType(DataType.Password)] 
     public string Password { get; set; } 

     [Compare("Password", ErrorMessage ="Password not valid")] 
     [DataType(DataType.Password)] 

     [Required(ErrorMessage = "User Name required")] 
     public string ConfirmPassword { get; set; } 

    } 
} 



//------------------------------- 
//UserAccountModel.cs 
//------------------------------- 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace MvcSia.Models 
{ 
    public class UserAccontModel 
    { 
     private List<UserAccont> listAccounts = new List<UserAccont>(); 

     public UserAccont find(string username) 
     { 
      return listAccounts.Single(acc => acc.UserName.Equals(username)); 
     } 

     public UserAccont login(string username, string password) 
     { 
      return listAccounts.Where(acc => acc.UserName.Equals(username)); 

     } 

    } 

} 
+3

嗯,你的方法是爲了返回'UserAccont'(錯字了'UserAccount',順便說一句),但'Where'方法會返回一個IEnumerable的''。也許你的意思是'FirstOrDefault'而不是'Where'?我還*強烈*鼓勵你遵循.NET命名約定。 –

+0

您的方法期望返回類型爲'UserAccont'而不是'List的集合' – garfbradaz

+0

如果更改爲FirstOrDefault或SingleOrDefault,請不要忘記從登錄方法中檢查返回值。另外,我會在您的Find方法上使用FirstOrDefault或SingleOrDefault,並且也檢查它們。如果一個用戶賬戶不存在,你的查找會拋出一個異常。 – Bearcat9425

回答

0

你所得到的錯誤是:

無法隱式轉換類型IEnumerable<UserAccont>UserAccont

你的方法試圖返回IEnumerable<UserAccont>(幾個),但簽名說,它應該返回UserAccont(之一)。你可能想要的是FirstOrDefaultSingleOrDefault

LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteria

當您使用Where,它會創建一個IEnumerable<UserAccont>所有符合條件的項目。但是你的方法的簽名表明你只想返回一個項目。

public UserAccont login(string username, string password) 
    { 
     // Fetch one item instead. 
     return listAccounts.FirstOrDefault(acc => acc.UserName.Equals(username)); 
    } 
0

它看起來像你試圖返回IEnumerable<UserAccount>當方法有望UserAccount

嘗試使用一種方法返回一個單個用戶帳戶對象。

public UserAccont login(string username, string password) 
{ 
    return listAccounts.Single(acc => acc.UserName.Equals(username)); 
} 
0
return listAccounts.Where(acc => acc.UserName.Equals(username)); 

這將返回IEnumerable<T>

return listAccounts.Where(acc => acc.UserName.Equals(username)).ToList(); 

這將返回一個List<T>

return listAccounts.Where(acc => acc.UserName.Equals(username)).FirstOrDefault(); 

這將在List<T>在你的情況下返回 「T」 將是UserAccount單個實例這最好是你想要的。

0

如果您嘗試僅返回UserAccont的類型,請使用FirstOrDefault()方法。

public UserAccont login(string username, string password) 
{ 
     List<UserAccont> listOfUserAcconts = new List<UserAccont>(); 

     //Stops you throwing an Exception is username is null 
     if(listAccounts.Count() > 0 && !String.IsNullOrWhiteSpace(username)) 
     { 
      return listAccounts.FirstOrDefault(acc => acc.UserName.Equals(username)); 
     } 
     else 
     { 
      return listOfUserAcconts; 
     } 
}