最近MVCを使い始めたばかりのかなり経験豊富なASP.Net開発者として、私は自分の考え方を従来の「サーバーコントロールとイベントハンドラー」のやり方から、より動的なMVCのやり方に変えるのに少し苦労していることに気づきました。私はゆっくりとそこに到達していると思いますが、MVC の "魔法" が私を失望させることがあります。
私の現在のシナリオは、ユーザーがローカル ファイルを参照し、それをサーバーにアップロードして、操作するファイルのリストができるまでこれを繰り返すことができる Web ページを作成することです。ファイル リスト (ページのグリッドに表示される) に満足したら、ボタンをクリックしてファイルを処理し、データベースに保存されるデータを抽出します。
最後の部分はそれほど重要ではありません。現在、ファイルのリストを作成し、リクエスト間でそのリストを永続化するのと同じくらい簡単なことに苦労しています。従来のアプローチでは、これは非常に単純です。データは ViewState に保持されます。しかし、MVC では、コントローラーとビューの間でデータを渡す必要があり、これがどのように機能するのか完全にはわかりません。
問題を説明するために、これをコーディングするかなり不完全な試みを投稿したほうがよいと思います。
ファイル リスト データを保持するために、基本的に型指定されたファイルのリストであるビューモデルをいくつかの追加のメタデータと共に作成しました。
public class ImportDataViewModel
{
public ImportDataViewModel()
{
Files = new List<ImportDataFile>();
}
public List<ImportDataFile> Files { get; set; }
...
ビューには、ファイルを参照してアップロードするためのフォームがあります。
<form action="AddImportFile" method="post" enctype="multipart/form-data">
<label for="file">
Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" />
</form>
ビューはビューモデルをモデルとして使用しています:
@model MHP.ViewModels.ImportDataViewModel
これにより、ファイルが私のアクションに送信されます。
public ActionResult AddImportFile(HttpPostedFileBase file, ImportDataViewModel importData)
{
if (file.ContentLength > 0)
{
ImportDataFile idFile = new ImportDataFile { File = file };
importData.Files.Add(idFile);
}
return View("DataImport", importData);
}
このアクションは、DataImport ページのビューと、ファイルのリストを含むビューモデル インスタンスを返します。
これは特定のポイントまでうまく機能し、ファイルを参照してアップロードし、アクション内のビューモデル データを確認できます。また、ビュー内にブレークポイントを配置して「this.Model」をデバッグすると、すべてが大丈夫。
しかし、別のファイルをアップロードしようとすると、AddImportFile アクション内にブレークポイントを配置すると、importData パラメータが空になります。したがって、ビューは明らかにそのモデルの現在のインスタンスをアクションに渡していません。
私が経験した MVC サンプルでは、モデル インスタンスは「魔法のように」パラメーターとしてアクション メソッドに渡されますが、なぜ今は空なのですか?
本当の問題は、MVC についての私の理解が限られていることであり、おそらくこれには非常に簡単な解決策があると思います。とにかく、誰かが私を正しい方向に向けることができれば、私は非常に感謝しています.