我正在关注http://www.mikesdotnetting.com/Article/125/ASP.NET-MVC-Uploading-and-Downloading-Files。使用VS2010,ASP.NET 4.0,C#中的MVC3和SQL Server 2008R2中的ADO.NET。我收到以下错误消息...
传递到字典中的模型项的类型为“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请求的过程中生成了未处理的异常。可以使用下面的异常堆栈跟踪来标识有关异常的来源和位置的信息。
我担心我的Index方法可能出错。在此先感谢您是否可以告诉我解决此问题的方法。
控制器中的索引方法具有以下代码...
FileStore db = new FileStore();
public ActionResult Index()
{
var db = new FileStore();
return View(db);
}
控制器中的create方法具有以下方法...
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>
最佳答案
您的视图已严格键入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);