2011-03-26 6 views
0

私はEFを使用しているMVC 3アプリを持っています。ユーザーのログイン時には、ajaxを使用してユーザーを認証し、必要なものの一覧を返したいと思います。私はViewModelLoginにIEnumerableを持っています。 AutoMapperを使用して、EFエンティティからViewModelを入力し、ViewModelをJSONとして返します。MVCからJSONとして子を持つEFエンティティを返します。

[HttpPost] 
    public ActionResult Login(ViewModelLogin login) 
    { 
     Mapper.CreateMap<ViewModelLogin, User>() 
      .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email)) 
      .ForMember(dest => dest.Password, opt => opt.MapFrom(src => src.Password)); 

     var user = _userService.GetUser(Mapper.Map<ViewModelLogin, User>(login)); 

     if (user != null && CreatePasswordHash(login.Password, user.Salt) == user.Password) 
     { 
      var ticket = new FormsAuthenticationTicket(1, login.Email, DateTime.Now, DateTime.Now.AddMinutes(20), false, ""); 
      var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)); 
      Response.Cookies.Add(cookie); 

      Mapper.CreateMap<User, ViewModelLogin>() 
       .ForMember(dest => dest.Things, opt => opt.MapFrom(src => src.Things)) 
       .ForMember(dest => dest.Password, opt => opt.Ignore()); 
      var returnLogin = Mapper.Map<User, ViewModelLogin>(user); 
      returnLogin.Success = true; 

      return Json(returnLogin); 
     } 
     return Json(new ViewModelLogin { Success = false, Message = "Test Message"}); 
    } 

シリアライザがエンティティをJSONに変換しようとするとエラーが発生します。この問題は循環的な依存関係です。なぜなら、コレクションはEFからの関係情報を保持しているからです(私の場合は多対多の関係)。

おかげ

答えて

0

あなたはあなたのビューモデルから循環依存関係を削除する必要があります。また、JSONとしてそれをシリアル化することができるようしたいです。また、コントローラにMapper.CreateMap<TSource, TDest>を呼び出さないでください。このメソッドは、Application_Startに一度だけ理想的に呼び出す必要があります。

+0

シリアライザに問題があります。私は – abarr

+0

@abarrを集めることができません。問題はJavaScriptSerializerが循環依存関係をシリアル化できないことです。オブジェクトグラフでこの依存関係を壊さない限り、 JSON仕様書に循環依存性の構文がどのようなものかを定義するものは何もないことは言うまでもなく、JSONを直列化することができます。 –

+0

http://mytechworld.officeacuity.com/?p=577これは私がエンティティ間の多対多の関係を必要とするため、私がしたことです。 – abarr

関連する問題