0

ここで以前の質問をしましたが、その一部はそれ自体が主題全体のようです。

コントローラー呼び出し間でファイル データを保持しようとしています。

シナリオは次のとおりです。ユーザーが、データベースに送信するエントリを含むファイルをアップロードします。ファイルに警告とエラーがある場合、それらは検証ページにリダイレクトされます。警告やエラーがない場合、ファイルは直接処理されます。

ユーザーが警告を受け取ってもエラーが発生しない場合 (つまり、テキスト フィールドが長すぎて切り捨てられる場合)、ユーザーはファイルをインポートできます。ファイルのアップロードとデータベースへの送信の間には 2 つの別個の画面があるため、ファイル データを保持する必要があります。

私はこれに似た質問をたくさん見ましたが、どれも関連性のある回答を持っていないようです (したがって、同様の質問にこの正確な問題に対する回答がない場合は、この質問を重複としてマークしないでください)。

私の最初のアイデアは、アップロードされたファイル名 + GUID を使用してファイルを保存し、そのファイル名をセッション状態に保存することでしたが、以前の質問で得た回答はすべて、これがひどい解決策であるとかなり断言していました。

他の同様の質問に対して私が見つけた解決策:

  1. ファイルを再アップロードします (ひどい解決策)
  2. ビューバッグを使用してファイル名をビューに送信し、2 番目のコントローラーに送り返す (正しく聞こえません)
  3. ビューモデルにファイルの場所を保存してビューに送信し、2番目のコントローラーで再度取得します(これも正しく聞こえません)
  4. ファイルの場所をセッションまたは一時データに保存します (一般的に好ましくない意見を受け取ります)。

私は調査を行いましたが、これについて最善の方法を見つけることができません。誰か助けてくれませんか?別の質問がこれに答えると思われる場合は、すでにかなりの検索を行っているため、これを重複として報告するのではなく、回答として私に送信してください.

ありがとう、サミュエル・デイビス

編集:私のユーザーはセッションを利用できます。私が考えることができる別の解決策は、セッションIDに含まれるGUIDにハードコードされた文字列を追加することです. 「MyImporter-xxxx.xxxx.xxxx.xxxx.csv」。このように、「MyImporter」はプライベート定数文字列にすることができ、コントローラーは識別子を永続化する必要がありません。この方法の欠点については確信が持てませんが、MVC を初めて使用するので、思いもよらなかったケースもあるはずです。

4

2 に答える 2

1

最善の方法は、ファイルの場所をサーバーに保存することです。セッションまたはデータベース。

フロー:

  1. ユーザーがファイルをアップロード
  2. The server stores the file in a some location on the server and stores the location of this file in a Session variable or in the Database
  3. The user sends a second request
  4. The server retrieves the location from the Session or the Database.
  5. The server does something with the file

It's worth mentioning that if you decide to store the file location in a database, you should also store the currently authenticated user in the same table so that you could later retrieve the correct record. If you are not using authentication that might not be a good solution because you will not be able to retrieve the record. In this case you could use a hard to guess identifier in the database to store the file location under. Then this identifier will be passed to the view (under the form of a view model of course) and passed on subsequent request. It is important that this identifier is difficult to guess to avoid one user working with the files of another user.

Another possible solution might be to store the location of the file in an encrypted cookie which will be sent on subsequent request.

于 2012-12-13T20:06:14.353 に答える
0

聞いたことがありTempDataますか?自己破壊的なセッション値のようなものです。

于 2012-12-13T20:04:48.697 に答える