2016-11-16 15 views
-2

私はAsp.Net MVC 5(コードファースト)でカスタム認証と認証を作成しようとします。 はすることはできません:私は2クラスを作成したモデルで、UserAccountUserAccountModelIEnumerableキャストエラーC#

私は、エラーコードが英語ではありませんが、このようなものであるUserAccountModel

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

にエラーが発生しています暗黙的に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

さて、あなたの方法は、(ところで、UserAccount' 'のためにタイプミス)' UserAccont'を返すためのものですが、 'WHERE'方法は、単に' IEnumerableを 'を返します。おそらく、あなたは 'Where'ではなく' FirstOrDefault'を意味していたでしょうか?また、.NET命名規則に従うことを強くお勧めします。 –

+0

あなたのメソッドは 'UserAccont'の戻り値の型を期待し、' List 'のコレクションではありません – garfbradaz

+0

FirstOrDefaultまたはSingleOrDefaultに変更すると、ログインメソッドからの戻り値をチェックするのを忘れないでください。また、FirstOrDefaultまたはSingleOrDefaultをFindメソッドで使用し、nullも同様にチェックします。存在しないユーザーアカウントが渡された場合、findは例外をスローします。 – Bearcat9425

答えて

0

あなたが取得しているエラーは、次のとおりです。

が暗黙のうちに UserAccontにタイプIEnumerable<UserAccont>を変換できません。

あなたの方法はIEnumerable<UserAccont>(数)を返すようにしようとしますが、署名は、それはUserAccont(1)を返すべきであると述べています。おそらくあなたが望むのはFirstOrDefault、またはSingleOrDefaultです。

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

あなたがWhereを使用

、それはあなたの条件に一致する IEnumerable<UserAccont>すべて を持つアイテムを作成します。しかし、あなたのメソッドの署名は、あなたが1つのアイテムを返すだけであることを示唆しています。

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

それはあなたの方法がUserAccountを期待するときIEnumerable<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)); 

これはこれはこれはあなたのケースでList<T>で "T" を返しますList<T>

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

UserAccountの単一のインスタンスになります返すIEnumerable<T>

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

を返します。それはあなたが望むものであることが好ましい。

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; 
     } 
} 
関連する問題