0

ファイルを取得するフォームがありますが、これはすべて機能します。フォーム ポスト コントローラーは、データベース内に既に同じ名前のファイルが存在するかどうかを調べるチェックを行い、存在する場合は、HttpPostFileBase オブジェクトをモデルとしてそのビューに渡します。

ビューは、ユーザーに上書きの確認を求めるモーダル ポップアップで構成されます。はいと答えると、ビューは実際にファイルをアップロードしてデータベースに情報を保存するために、新しいコントローラー アクションに投稿する必要があります。

@model System.Web.HttpPostedFileBase
....
'Yes': function (modal) {
    //Post to UploadFile
    $.ajax({
        url: '@Url.Action("UploadFile", "Media", new { area = "Manage" })',
        type: 'POST',
        data: { id: @locationid, file: @Model }
    });
    modal.closeModal();
},

ページで生成されたソースを見ると、データは次のようになっています。

data: { id: 1, file: System.Web.HttpPostedFileWrapper }

UploadFile は私が渡したものを期待していますが、HttpPostedFileBase

private void UploadFile(int locationid, HttpPostedFileBase file)

ただし、そこに到達する前に、javascript がエラーをスローします。

Uncaught ReferenceError: System is not defined 

だから私は追加しました

@using System.Web

おそらく System.Web.HttpPostedFileWrapper が何であるかを理解していなかっただけだと思います。これはまったく役に立ちませんでした。これにどのようにアプローチするのが良いかについて、誰か提案がありますか?

4

1 に答える 1

0

そのようなビューで呼び出す@Modelと、モデルの文字列表現をページに出力しようとします。.NET は、オブジェクトを呼び出すことによってこれを内部的.ToString()に行います。デフォルトでは.ToString()、参照型は型の名前を返します。この場合、それは"System.Web.HttpPostedFileWrapper". これが JavaScript コードに出力されているものです。

ディレクティブを追加しても、@usingそれは変わりません。それはすべてサーバー側の動作です。表示されているエラーは、生の文字列System.Web.HttpPostedFileWrapperが JavaScript で何の意味もないためです。そのため、JavaScript パーサーはそれをどう処理すればよいかわかりません。

ここで正確に何を達成しようとしているのか、またその理由は何ですか? あなたがやろうとしていることについて私は間違っているかもしれませんが、ここに行きます...

投稿されたファイル全体を JavaScript に発行しようとしているように見えますが、変更せずにサーバーに投稿するだけです。まず第一に、これはおそらくあなたが思っているようには機能しません。しかし、もっと重要なことは、サーバー側のファイルが既にあり、ユーザーにファイルについて何か確認を求めているだけの場合、ファイル全体をユーザーに再度渡す理由がないということです。再びサーバー。

モデル全体を JavaScript に発行しようとする代わりに、ファイルの何らかの識別子のみを発行します。サーバー側のファイルをどこに保存し、どのように一意に識別しますか? 何らかの識別子 (例として、データベース レコードからの整数としましょう) がある場合、クライアント側で必要なのはその識別子だけです。何らかのビュー モデルにラップして、必要に応じて機能を簡単に追加できます。何かのようなもの:

public class FileConfirmationModel
{
    public int FileID { get; set; }
}

プロパティを設定してそのモデルをビューに渡すと、ビューでFileIDその ID を JavaScript コードで使用できます。

data: { id: @locationid, file: @Model.FileID }

(ちなみに、は@locationidどこから来たのですか? たぶん、これらはすべて 1 つのビュー モデルにあるはずですか?)

次に、その AJAX ハンドラーのサーバー側コードで、ID に基づいて既に持っているファイルを見つけ、そのファイルに対して必要なことを何でも行います。

于 2013-09-11T17:49:24.353 に答える