2011-04-18 5 views
3

私はhttp://www.mikesdotnetting.com/Article/125/ASP.NET-MVC-Uploading-and-Downloading-Filesに従っています。 VS2010、ASP.NET 4.0、MVC3をC#で使用し、SQL Server 2008 R2でADO.NETを使用する。次のエラーメッセージが表示されています...この辞書には、 'System.Collections.Generic.IEnumerable`1 [MvcApplication1.Models.FileStore]'のモデルアイテムが必要です。

辞書に渡されるモデルアイテムは 'MvcApplication1.Models.FileStore'タイプですが、この辞書には 'System.Collections.Generic.IEnumerableタイプのモデルアイテムが必要です1[MvcApplication1.Models.FileStore]'. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.InvalidOperationException: The model item passed into the dictionary is of type 'MvcApplication1.Models.FileStore', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [MvcApplication1.Models.FileStore] '。 ソースエラー:現在のWeb要求の実行中に、未処理の例外が生成されました。以下の例外スタックトレースを使用して、例外の起点および場所に関する情報を識別できます。

私は私のインデックス方法が間違っている可能性があります少し心配です。誰か私にこの問題を解決策を教えてもらえれば、事前に感謝します。

コントローラのインデックスメソッドは、次のコードを持っている...

FileStore db = new FileStore(); 

    public ActionResult Index() 
    { 
     var db = new FileStore(); 
     return View(db); 
    } 

コントローラにメソッドを作成し、以下の方法があります...

public ActionResult Create() 
    { 
     foreach (string upload in Request.Files) 
     { 
      if (!Request.Files[upload].HasFile()) continue; 

      string mimeType = Request.Files[upload].ContentType; 
      Stream fileStream = Request.Files[upload].InputStream; 
      string fileName = Path.GetFileName(Request.Files[upload].FileName); 
      int fileLength = Request.Files[upload].ContentLength; 
      byte[] fileData = new byte[fileLength]; 
      fileStream.Read(fileData, 0, fileLength); 

      const string connect = @"Server=.\SQLExpress;Database=FileTest;Trusted_Connection=True;"; 
      using (var conn = new SqlConnection(connect)) 
      { 
       var qry = "INSERT INTO FileStore (FileContent, MimeType, FileName) VALUES (@FileContent, @MimeType, @FileName)"; 
       var cmd = new SqlCommand(qry, conn); 
       cmd.Parameters.AddWithValue("@FileContent", fileData); 
       cmd.Parameters.AddWithValue("@MimeType", mimeType); 
       cmd.Parameters.AddWithValue("@FileName", fileName); 
       conn.Open(); 
       cmd.ExecuteNonQuery(); 
      } 
     } 
     return View(); 
    } 

とGETFILE方法は、次のコードを持っています。 ..

public FileContentResult GetFile(int id) 
    { 
     SqlDataReader rdr; byte[] fileContent = null; 
     string mimeType = ""; string fileName = ""; 
     const string connect = @"Server=.\SQLExpress;Database=FileTest;Trusted_Connection=True;"; 

     using (var conn = new SqlConnection(connect)) 
     { 
      var qry = "SELECT FileContent, MimeType, FileName FROM FileStore WHERE ID = @ID"; 
      var cmd = new SqlCommand(qry, conn); 
      cmd.Parameters.AddWithValue("@ID", id); 
      conn.Open(); 
      rdr = cmd.ExecuteReader(); 
      if (rdr.HasRows) 
      { 
       rdr.Read(); 
       fileContent = (byte[])rdr["FileContent"]; 
       mimeType = rdr["MimeType"].ToString(); 
       fileName = rdr["FileName"].ToString(); 
      } 
     } 
     return File(fileContent, mimeType, fileName); 
    } 

Index.cshtmlには次のコードがあります。

@model IEnumerable<MvcApplication1.Models.FileStore> 

答えて

4

あなたのビューは、FileStoreコレクション(例:リスト)に強く入力されます。 1つのオブジェクトだけを送信する場合は、それを変更する必要があります。それ以外の場合は、最初にコレクションを作成し、そのコレクションにオブジェクトを追加してからビューに送信します。

最初の方法を使用する場合は、インデックスビューの最初の行を参照してください。このようなステートメントが必要です。

Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcApplication1.Models.FileStore>> 

私は、それはMVC 3で異なる場合がありますこれは、ビューを述べて私の見解から、それを取ったが強く、それが

Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.FileStore> 

ファイルストアcollection.Changeに型付けされたアップデート:

ます剃刀を使用しています。私はそれに慣れていないですが、あなたはモデルラインを変更する必要があります。

@model MvcApplication1.Models.FileStore 

や追加、アクションメソッドでリストを作成し、これらのオブジェクトを複数送信する必要がある場合

@model IEnumerable<MvcApplication1.Models.FileStore> 

何でもあなたはリポジトリがあなたのためにそれを手に入れたいと思っています。

List<FileStore> fileStores=new List<FileStore>(); 
FileStore fileStore=new FileStore(); 
fileStores.Add(fileStore); 
return View(fileStores); 

または

var someFileStores=repository.GetSomeStores(); 
return View(someFileStores); 
+0

おかげで素晴らしいです。ご協力いただきありがとうございます。私は通常、db getterとsetterで、あるクラスのクラスを持つことをお勧めします。私はmikesdotnetting.comウェブサイトを使用して複数のDBイメージを実装しようとしています。 – DiscoDude

関連する問題