我的数据库中有一个类型为image的字段,在我的模型中映射为二进制(ADO.NET Entity Framework)。
但不知何故,我从输入文件框中获取的图像未传递给该对象。我知道这是因为我弄乱了我的动作和对象语言(我试图上传到数据库的图像是一个标志)将属性Flag设置为null,这非常糟糕!它应该包含上传的图像。我还需要做点什么吗?
下面是我的表单html代码和我的操作代码:
<% using (Html.BeginForm("Create", "Language", FormMethod.Post,
new {enctype="multipart/form-data"})) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="Id">Id:</label>
<%= Html.TextBox("Id") %>
<%= Html.ValidationMessage("Id", "*") %>
</p>
<p>
<label for="Name">Name:</label>
<%= Html.TextBox("Name") %>
<%= Html.ValidationMessage("Name", "*") %>
</p>
<p>
<label for="Flag">Flag:</label>
<!--
File box is a helper that I got from this link:
http://pupeno.com/blog/file-input-type-for-forms-in-for-asp-net-mvc/
-->
<%= Html.FileBox("Flag") %>
<%= Html.ValidationMessage("Flag", "*") %>
</p>
<p>
<label for="IsDefault">IsDefault:</label>
<%= Html.TextBox("IsDefault") %>
<%= Html.ValidationMessage("IsDefault", "*") %>
</p>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
我正在使用Visual Studio 2008。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Language language)
{
// Here language.Flag is null. Shouldn't the Flag property be a
// binary field ready to be stored in the database along with the others?
if (!ModelState.IsValid || !_service.CreateLanguage(language))
{
return View("Create", language);
}
return RedirectToAction("Index");
}
我做错了什么?
答案 0 :(得分:2)
我已经能够通过在我的action方法中添加HttpPostedFileBase参数来上传文件。在这种情况下,我不相信ASP.NET MVC会自动为您填充语言参数的属性。
答案 1 :(得分:1)
文件上传与普通帖子字段完全不同。您在Request.Files中上传了这些内容。我正在做这样的事情来拿起:
if (Request.Files.Count != 1 || Request.Files[0].ContentLength == 0) {
ModelState.AddModelError("Picture", "Picture is missing");
} else if (!IsImage(Request.Files[0].ContentType)) {
ModelState.AddModelError("Picture", "The picture must be a JPEG or PNG");
} else {
try {
Save(Request.Files[0].InputStream);
} catch {
ModelState.AddModelError("Picture", "Something is wrong with the picture, we couldn't open it");
}
}
IsImage和Save实际上比我的代码要复杂得多。如果要将其保存到模型和数据库,则需要convert the stream into a byte array。
答案 2 :(得分:0)
感谢您的回复,但幸运的是我找到了更好的方法。
我改变了动作方法签名:
的[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(语言语言)
于:
的[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(HttpPostedFileBase Flag,Language language)
然后我将Flag文件名归因于language.Flag并且仅保留对文件所在位置的引用(这是因为我们决定保持数据库尽可能小,但我确信这个新签名也能正常工作将文件转换为数据库)。
希望这对其他人也有帮助!
抱歉,我不能给你竖起大拇指。声誉不够......