0

MVC、Entity Framework、Durandal、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 class UserImage
{
    public Guid Id { get; set; }

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

現在のユーザーを取得するために、サーバー上に api 関数があります。

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;
    }

そして、現在のユーザーを取得するクライアントでの 2 つの呼び出し。最初はシェルにあります:

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;
        });
    }

2 番目は 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 インターセプトを確認したところ、2 つのエンティティが保存されていることがわかりました。

  1. ImageId が設定された更新されたユーザー
  2. 新しいユーザーイメージ

データはデータベースにも表示されます。[ユーザーの管理] ページを更新すると、フィドラーで 2 つの GetCurrentUser 呼び出しが表示されます。

  1. シェル呼び出しから、ユーザーが返され、ImageId が設定されていることがわかりますが、クエリを展開しなかったため、UserImage は送信されませんでした。
  2. Manage User 呼び出しから、User が返されていることがわかりますが、ImageId のみが送信され、Image オブジェクトは JSON から省略されました。

画像でこの問題に遭遇した人はいますか? 他のすべての展開は正しく機能しているようです。イメージへのファイルパスだけを保存するためにそよ風を使用し、おそらくメディアストレージに Windows azure を使用する例はありますか?

4

1 に答える 1

0

これはおそらくあなたの質問に答えないことはわかっていますが、バイト配列をクライアントに送信せず、サーバー側に ImageId をパラメーターとして取り、関連するコンテンツ タイプ セットを含む画像を返すイメージ ハンドラーを用意することを提案します。 . この例はここにあります。

このアプローチを使用すると、ソースが関連する ImageId を持つイメージ ハンドラーに設定された img タグを使用して、HTML からイメージを参照できます。

データ バインディングにノックアウトを使用する例は次のとおりです。

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

このアプローチにより、サーバーとクライアントの両方にキャッシュを簡単に追加できるため、パフォーマンスが向上します。また、クライアント側でバイト配列を画像に変換する必要がなくなりました。これは面倒かもしれません。

編集:

管理対象ユーザーを保存するときは、ImageHandler の Upload アクションにイメージを投稿します (この記事を参照してください)。このアクションは、イメージの新しい ID を返す必要があります。新しい Id を受け取ったら、クライアント側で User.ImageId を更新し、そよ風で SaveChanges を呼び出します。

于 2013-07-19T05:08:37.823 に答える