3

Orchard의 인스턴스에서 사용자 지정 콘텐츠 부분이있는 사용자 지정 콘텐츠 형식이 있습니다. 컨텐트 부분의 "편집기 드라이버"에서 컨테이너 컨텐트 항목이 유효한지 (즉 유효성 검사를 통과하는지) 확인해야합니다.과수원 CMS - 모델이 콘텐츠 항목 드라이버에서 유효한지 결정

Orchard의 작동 방식으로 인해 정상적인 ModelState가 작동하지 않습니다. 콘텐츠 부분이 유효한지 확인할 수 있지만 전체 콘텐츠 항목 (콘텐츠 항목 내에 다른 콘텐츠 부분이 있음)을 알아야합니다. .

라이프 사이클 이벤트 (http://docs.orchardproject.net/Documentation/Understanding-content-handlers)를 사용하여 콘텐츠 파트가 게시/생성되었지만 해당 이벤트 정보를 전달할 방법이 없다는 것을 알고 있습니다.

기본적으로 컨텐트 항목이 유효하고 ViewModel 내에 포함 된 메서드 정보를 전달해야하는 경우 메서드를 실행해야합니다.

이 작업을 수행하는 더 좋은 방법이있을 수 있지만 나는 과수원 프레임 워크에서 방법을 찾기 위해 애 쓰고 있습니다.

샘플 코드 :

//POST 
protected override DriverResult Editor(EventPart part, IUpdateModel updater, dynamic shapeHelper) 
{ 
    var viewModal = new EventEditViewModel(); 

    if (updater.TryUpdateModel(viewModal, Prefix, null, null)) 
    { 
     part.Setting = viewModal.Setting; 
    } 

    //here's where I need to check if the CONTENT ITEM is valid or not, for example 
    if (*valid*) 
    { 
     DoSomething(viewModal.OtherSetting); 
    } 

    return Editor(part, shapeHelper); 
} 

참고 : 나는 오차드 버전 1.6을 사용하고 있습니다.

+0

수 : 그렇게하기 위해서는

,이 같은 기본 하나 대신 컨트롤러를 사용하는 과수원을 가리 키도록 핸들러에게 OnGetContentItemMetadata 방법을 사용할 필요가 (당신이 이미 당신의 컨트롤러가 가정) 시나리오에 대해 더 자세히 설명해 주시겠습니까? 왜 그럴 필요가 있니? –

답변

4

드라이버 내부에서 그렇게 쉬운 방법이 아닙니다. 두려워요. 너무 이른. part.As<OtherPart>을 통해 다른 부분에 액세스 할 수 있지만, 아직 업데이트되지 않았거나 아직 업데이트되지 않았을 수 있습니다.

는이 같은 핸들러와 OnPublishing/OnPublished (및 기타) 이벤트를 사용하려고 할 수 있습니다 : transactions는 ctor에 주입 ITransactionManager 인스턴스는,

 OnPublishing<MyPart>((ctx, part) => 
     { 
      // Do some validation checks on other parts 
      if (part.As<SomeOtherPart>().SomeSetting == true) 
      { 
       notifier.Error(T("SomeSetting cannot be true.")); 
       transactions.Cancel(); 
      } 
     }); 

입니다.

더 많은 제어가 필요한 경우 항목 업데이트/생성을 처리하기위한 자체 컨트롤러를 작성하는 것이 가장 좋은 방법입니다.

 OnGetContentItemMetadata<MyPart>((context, part) => 
     { 
      // Edit item action 
      context.Metadata.EditorRouteValues = new RouteValueDictionary { 
      {"Area", "My.Module"}, 
      {"Controller", "Item"}, 
      {"Action", "Edit"}, 
      {"id", context.ContentItem.Id}}; 

      // Create new item action 
      context.Metadata.CreateRouteValues = new RouteValueDictionary { 
      {"Area", "My.Module"}, 
      {"Controller", "Item"}, 
      {"Action", "Create"}); 
     }); 
+0

+1 나와 내 문제도 해결했습니다. http://stackoverflow.com/questions/19242539/orchard-connected-parts/19269461#19269461 감사합니다. – manudea