2013-07-18 2 views
0

MVC, Entity Framework, Durandal 및 Breeze JS를 사용하고 있습니다. (단순화 된) 사용자가 있습니다.Breeze JS로 이미지 탐색 속성을 확장 할 수 없습니다.

public class User : EntityBase<Guid>, IAggregateRoot 
{ 
    public Guid Id { get; set; } 
    public string UserName { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    [ForeignKey("UserImage")] 
    public virtual Guid? ImageId { get; set; } 

    public virtual UserImage UserImage { get; set; } 
} 

UserImage 클래스는 다음과 같습니다. 이미지의 크기를 제한해야한다는 것을 알고 있습니다. (아마이 문제인가?) : 현재 사용자를 얻을 클라이언트에서

public IQueryable<User> GetCurrentUser() 
    { 
     IPrincipal principal = HttpContext.Current.User; 
     var users = _uow.Users.FindBy(u => u.UserName.Equals(principal.Identity.Name)); 
     if (!users.Any()) 
     { 
      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized)); 
     } 

     return users; 
    } 

그리고 두 통화 : 내가있어

public class UserImage 
{ 
    public Guid Id { get; set; } 

    [MaxLength] 
    public byte[] Image { get; set; }   
} 

서버 API 함수는 현재 사용자를 얻을 수 . 첫 번째는 쉘에 있습니다

function loadCurrentUser() { 
     return uow.CurrentUser.all().then(function (newUser) { 
      log('Welcome to the Site ' + newUser[0].FullName() + '!', newUser[0], true); 
      config.CurrentUser(newUser[0]); 
      return true; 
     }); 
    } 

두 번째는 ManageUser의 뷰 모델에 있습니다

function activate() { 
        return uow.CurrentUser.all(['UserImage']).then(function (user) { 
         self.CurrentUser(user[0]); 
         return $.when(init()).then(boot()); 
        }).fail(function() { 
         return router.activate('accounts/login'); 
        }); 
       } 

지금 나는 ManageUser 페이지에 이미지를로드하고 저장하고 피들러에 보여줍니다 수있는 ImageId 및 이미지가 서버로 전송됩니다. 그런 다음 BeforeSaveEntity 절편을 검사하여 저장되는 두 개의 엔터티를 보여줍니다. ImageId와

  1. 업데이트 된 사용자 데이터는 또한 데이터베이스에서 볼 수

  • 새로운 UserImage에게
  • 을 설정합니다. 이제 Manage User 페이지를 새로 고침하면 피들러에서 두 개의 GetCurrentUser 호출을 볼 수 있습니다.

    1. 셸 호출에서 사용자가 반환되고 ImageId가 설정되었지만 쿼리를 확장하지 않았기 때문에 UserImage가 전송되지 않았 음을 알 수 있습니다.
    2. Manage User (사용자 관리) 호출에서 User가 반환되지만 ImageId 만 보내지고 Image 객체는 JSON에서 제외되었습니다.

    누구든지이 문제를 이미지로 보았습니까? 내 모든 다른 확장이 제대로 작동하는 것 같습니다. 누구든지 breeze를 사용하여 이미지 경로에 파일 경로를 저장하고 미디어 저장소에 azure를 사용하는 예가 있습니까?

    답변

    0

    이 질문에 대한 답변을 찾을 수 없지만 바이트 배열을 클라이언트에 보내지 않고 ImageId를 매개 변수로 사용하는 이미지 처리기를 서버 쪽에서 사용하고 관련 콘텐츠 유형 집합 이 예는 here입니다.

    이 방법을 사용하면 소스가 이미지 처리기로 설정된 img 태그와 관련 ImageId를 사용하여 HTML에서 이미지를 참조 할 수 있습니다.

    것 데이터 바인딩에 대한 녹아웃을 사용하는 예 :

    <a data-bind="attr: {href: '/Image/' + User.ImageId()}"></a> 
    

    이 방법을 사용하면 쉽게 성능을 개선 할 서버와 클라이언트에 캐싱을 추가 할 수 있습니다. 또한 바이트 배열을 클라이언트 측의 이미지로 변환해야하는 필요성을 없앴습니다. 이는 고통이 아닐 수도 있습니다.

    편집 :

    관리 사용자를 저장, (this article에 봐)에 ImageHandler에 업로드 행동에 이미지를 게시 할 수 있습니다. 이 작업은 이미지의 새 ID를 반환해야합니다. 새 ID를받은 다음 클라이언트 쪽에서 User.ImageId를 업데이트하고 breeze에서 SaveChanges를 호출하십시오.

    +0

    응답 해 주셔서 감사합니다. 이번 주말에이 접근법을 더 자세히 살펴 보겠습니다. 나는 바람의 힘을 시험하기 위해 주로 이런 식으로 노력했다. 따라서 페이지에서 사용자를 관리하고 이미지를 추가하여 저장하는 방법을 사용하면 관리 대상 사용자를 '/ Image/ImageId'로 가정 한 'UserImage'로 저장 한 'SaveChanges'를 호출 한 다음 이미지 컨트롤러로 이미지를 업로드 하시겠습니까? – user2344707

    +0

    답변을 업데이트했습니다. –

    +0

    정말 좋은 방법입니다. – user2344707

    관련 문제