但是这个字典需要一个类型为'System.Collections.Generic.IEnumerable`1 [MvcApplication1.Models.FileStore]'的模型项

时间:2011-04-18 19:45:09

标签: asp.net asp.net-mvc-3

我关注http://www.mikesdotnetting.com/Article/125/ASP.NET-MVC-Uploading-and-Downloading-Files。在SQL Server 2008R2中使用带有ADO.NET的C#中的VS2010,ASP.NET 4.0,MVC3。我收到以下错误消息...

传递到字典中的模型项的类型为' MvcApplication1.Models.FileStore',但此字典需要类型为' System.Collections.Generic.IEnumerable {的模型项。 {1}} 1 [MvcApplication1.Models.FileStore]&#39 ;. 源错误:在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

我很担心我的索引方法错了。如果有人能告诉我这个问题的解决方案,请提前感谢。

控制器中的索引方法具有以下代码...

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

控制器中的Create方法有以下方法......

 FileStore db = new FileStore();

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

和GetFile方法有以下代码......

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

Index.cshtml like有以下代码......

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

1 个答案:

答案 0 :(得分:4)

您的视图是对FileStore集合(例如列表)的强类型。如果您只发送一个对象,则应该更改它。否则,首先创建一个集合,将对象添加到集合中,然后将其发送到视图。

如果你要使用第一种方法,请查看索引视图中的第一行。应该有这样的声明。

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

我从我看来,它可能在MVC 3中有所不同。它声明视图是强类型的FileStore集合。更改它

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

<强>更新

您使用的是Razor。我不熟悉,但您应该更改模型行:

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