문제

나는 사용자 정의 모델 바인더를 사용하여 내 행동에서 Order/OrderItem을 바인딩합니다. 이 모델 바인더는 servicelocator.current.getinstance ()를 사용합니다. 여기서 ICART는 차례로 iOrderrepository에 의존합니다 (이것이 중요한지 확실하지 않음).

이제 1 차 항목을 만들 때 모든 것이 잘 작동합니다. 그리고 두 번째를 만들 때. 그런 다음 이제 두 개의 주문 항목이 포함 된 순서를 표시하려고합니다. 이것은 사용합니다

  public ActionResult Show(Order order) {}

주문이 내 맞춤형 바인더에 묶인 곳. 나는 그 bindmodel을 추적하고, 전화 후

  order = cart.GetOrder(id);

주문 항목은 괜찮습니다 - 즉, To Watch 창, 속성, 제품보기를 추가하면 모두 괜찮습니다.

그러나 제어 흐름이 쇼 (주문 순서) 액션 메소드에 오면 주문의 첫 번째 항목에는 유효하지 않은 제품이 있습니다.

nhibernate.lazyInitializationException : 초기화 [Orders.core.OrderItem#5440C233-FB7E-4DC9-8AEC-9C8C0115808B]-역할 모음을 게으르게 초기화하기 위해 : Orders.core.Arderitem.products, 없음 세션이 폐쇄되지 않음

순서를 볼 때 시계 창에서 이것을 볼 수 있습니다.

이상한 점은 2 차 항목이 여전히 괜찮다는 것입니다! 그렇다면

  • HTTP 요청 ... 내 모델 바인더 - OrderRepository.get (ID)를 사용하여 주문 받기 - 세션은 두 주문 항목 모두에 대해 괜찮습니다 ...
  • MVC는 마법을합니다
  • 액션 메소드 쇼 (주문 순서) <- 여기에 주문을위한 세션 [0]. 제품이 손실되고 항목의 경우 [1]은

순서에 다른 항목을 추가하면 Show ()에서 항목 [2]만이 제품이 정확합니다. 항목 [0]과 항목 [1] 제품은 모두 나쁘다 (세션 없음).

여기서 무슨 일이야?

요청 당 날카로운 아키텍처와 세션을 사용합니다. 실제로 엔드 레쿠스가 모델 바인더가 주문을받는 것 사이에서 호출되지 않았 음을 확인하고 ()가 잘못된 것을받는 쇼 ()가 순서를받는 것 사이에서 호출되지 않았 음을 확인했습니다.

업데이트 : 일부 코드 (중요한 라인)

public class Cart : ICart
{
      public Cart(IOrderRepository orderRepository, ICurrentUser currentUser, IUserSessionStorage storage) {}
      public Order GetOrder(Guid id)
      {
         return orderRepository.Get(id);
      }
}

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
  var cart = ServiceLocator.Current.GetInstance<ICart>();
  //Guid guidId = new Guid(id_value_from_context);
  var order = cart.GetOrder(guidId); // here order is OK completely
  return order;
}

OrderRepository는 S#ARP 아키텍처 저장소이며 WebSessionStorage 클래스를 사용하며 EndRequest 핸들러에서 세션 만 닫습니다. 내가 확인했듯이, 주문 사이에 호출되지 않았 음을 확인하지 못하고 주문은 그렇지 않습니다.

업데이트 : OrderRepository.save (Order) 주변의 추가 수동 거래로 인한 것인지 궁금합니다. 내일 조사 할 것이지만 여기에서 비슷한 것을 발견했습니다.

업데이트 : 또한 이후에만 발생합니다.

cart.Save(item);
return RedirectToAction<OrdersController>(c => c.Show(item.Order));

그런 다음 주소 표시 줄로 가서 "Enter"를 눌러 페이지를 다시로드하면 올바르게 작동합니다. 그래서 그것은 일회성 문제입니다.

재미있는 것은 내가 그렇게한다면 그런 버그가 없습니다.

return RedirectToAction("Show", "Orders", new { order = item.Order });

그래서 그것은 mvccontrib가 tempdata에서 질서를 다루려고 노력하는 것입니다.

컨트롤러에 이것을 가지고 있음을 알았습니다.

   [PassParametersDuringRedirect]
   public class OrdersController

Model Binder도 발사했지만 내 주문 매개 변수는 ModelBinder 대신 TempData에서 나왔다고 생각했습니다. 그러나 속성을 제거하면 문제가 사라지지 않았습니다. 그래서 그것은 mvccontrib의 redirecttocontroller <>가있는 것이지만 왜 이런 일이 일어나는지 전혀 모릅니다.

도움이 되었습니까?

해결책 2

오 마이 갓, 나는 내베이스 컨트롤러에 [passparametersduringredirect]를 넣었다. 나는 mvccontrib를 실험하고 그것을 잊어 버린 시간 동안 정말로 그것을했다. 그리고 그것은 돌아와서 나를 너무 나쁘게 물었습니다. 나는 이것을 해결하려고 몇 시간을 잃었습니다.

따라서 문제는 내가 어리 석고, 배운 교훈은 시스템 전체의 속성/행동을 수행하지 않아야한다는 것입니다. 이것은 부작용의 감각에서 글로벌 변수보다 낫지 않기 때문입니다.

다른 팁

nhibernate.lazyInitializationException : 초기화 [Orders.core.OrderItem#5440C233-FB7E-4DC9-8AEC-9C8C0115808B]-역할 모음을 게으르게 초기화하기 위해 : Orders.core.Arderitem.products, 없음 세션이 폐쇄되지 않음

제품을 요청하기 전에 세션이 종료되었음을 의미합니다. 세션을 닫는 것이 없다고 확신합니까? 코드를 게시 할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top