使用HttpPostedFileBase的强类型模型无法支持Scaffold Views

时间:2013-06-18 02:05:31

标签: c# asp.net-mvc-4

我希望有人可以帮助我。

我正在使用VS 2012和MVC4。

我正在使用 HttpPostedFileBase 使用强类型模型测试项目。当我试图通过以下方式支持视图失败:

---------------------------
Microsoft Visual Studio
---------------------------
Unable to retrieve metadata for 'ImageTest.Models.ImageHandler'. Value cannot be null.

Parameter name: key
---------------------------
OK   
---------------------------

我已尝试取消安装,然后重新安装MVC,就像在网上的一些帖子中所建议的那样,但这没有帮助。这是我的模型:(是的,我在Id上尝试了[Key],但没有区别)

using System;
using System.Web;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace ImageTest.Models
{
public class ImageHandler
{
public int Id { get; set; }
public string ImageName { get; set; }
public HttpPostedFileBase File { get; set; }
}
}

我认为它可能是一个上下文问题但是如果我创建自定义上下文或使用预定义的上下文并不重要我得到相同的错误。这是预定义的上下文:

using ImageTest.Models;
using System.Data.Entity;

public class ImageHandlerContext : DbContext
{
public ImageHandlerContext() : base("DefaultConnection")
{
}

public DbSet<ImageHandler> ImageHandler { get; set; }
}

作为测试,如果我发表评论:

// public HttpPostedFileBase File { get; set; }

我可以毫无问题地构建View。这是一个错误吗?我无法在文档中看到不支持Scaffolding HttpPostedFileBase的地方。请参阅:HttpPostedFileBase

提前致谢。

2 个答案:

答案 0 :(得分:2)

Stan 走在正确的轨道上。

模型 - 视图 - 控制器或MVC使用实体框架来支持视图。

Entity Data Model: Primitive Data Types

除非定义了复杂数据类型,否则.NET 4.5中目前支持原始数据类型。以下是支持的原始数据类型:

Binary
Boolean
Byte
DateTime
DateTimeOffset
Decimal
Double
Float
Guid
Int16
Int32
Int64
SByte
String
Time

有关扩展此功能的更多信息,请参阅:Complex Type

感谢Stan Thumbs up up。

编辑:首先需要使用原始数据类型来支持视图,然后再将HttpPostedFileBase添加到模型中以使用文件上载功能。例如,请参阅:Upload Image in form and show it on MVC 4

您还需要在模型中使用(NotMapped):

[NotMapped]
public HttpPostedFileBase File { get; set; }

现在,在Scaffolded Create ActionResult方法中,View的Form Return Valus包含一个可以使用的System.Web.HttpPostedFileWrapper。

如此简短的回答:

1: Create your Code First Model with Primitive Data Types only! Unless you use the [NotMapped] Attribute.
2: Scaffold your View's.
3: If not done so in step 1, Add to your Model the Methods needed.  E.G: public HttpPostedFileBase File { get; set; } using the [NotMapped] Attribute
4: Add to your Database the necessary Table either manually or from the Console.
5: Add the necessary code to your View's and Controller.

这应该足以让你工作......

答案 1 :(得分:1)

我认为您不能将HttpPostedFileBase作为模型的属性,至少不能通过EntityFramework进行映射并自动搭建。如果你考虑一下 - 你认为这个属性类型将映射到哪些数据库字段?

如果要将二进制数据实际存储在数据库中,请使用此

public byte[] File { get; set; }

作为您的财产。