2011-03-26 2 views
0

EF를 사용하는 MVC 3 앱이 있습니다. 내 사용자 로그인에서 나는 ajax를 사용하여 사용자를 인증하고 선택할 필요가있는 목록을 반환하고자합니다. ViewModelLogin에 IEnumerable이 있습니다. AutoMapper를 사용하여 EF Entity에서 ViewModel을 채운 다음 ViewModel을 JSON으로 반환합니다.MVC에서 JSON으로 Children과 함께 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

원형 의존성이 없다. 내가 수집 할 수있는 것에서 serializer에 문제가있다. – abarr

+0

@abarr, 문제는 JavaScriptSerializer가 원형 의존성을 직렬화 할 수 없다는 것이다. 객체 그래프에서이 종속성을 깨뜨리지 않으면 문제가되지 않는다. JSON을 직렬화 할 수 있어야합니다. JSON 사양에는 순환 종속성의 구문이 무엇인지 정의하는 내용이 없습니다. –

+0

http://mytechworld.officeacuity.com/?p=577 이것은 엔티티 간의 많은 관계가 필요하기 때문에 내가 결정한 것입니다. – abarr

관련 문제