2016-12-27 123 views
0

编辑:ASP.NET MVC上传照片 - httpPostedFileBase为null

照片在控制器POST方法空值,尽管我上传它..

我的模型类:

class ProductVM{ 
    public string Name { get; set;} 
    public string Color {get; set;} 
    public HttpPostedFileBase Photo1 { get; set; } 
    } 

下面是我如何用剃刀实现视图:

@model Project.Models.ProductVM 

     @using (Html.BeginForm("AddItem","Item", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 


      @Html.AntiForgeryToken() 
      @Html.ValidationSummary(true, "", new {@class = "text-danger"}) 

      @Html.EditorFor(model => model.Name, new {htmlAttributes = new {@class"form-control"}}) 
      @Html.ValidationMessageFor(model => model.Name) 

     // other fields editor's and dropdown's ... 


      <div class="col-xs-offset-2 col-xs-8 add-item-rectangle"><input type="file" name="@Model.Photo1" id="file"/></div> 
      <div class="col-xs-10 add-item-rectangle"></div> 

     <input type="submit" class="btn btn-block add-item-button-text" value="Send"/> 

后控制器方法的:

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult AddItem(ProductVM product) 
     {    
      //**heere when debuging Photo1 is null despite fact that i uploaded photo** 

      if (!ModelState.IsValid) 
      { 
       //... my stuffs 
      } 

      //.. 
      return RedirectToAction("Index", "Home"); 
     } 
+2

请参阅:[this](http://stackoverflow.com/questions/16255882/uploading-displaying-images-in-mvc-4) –

+0

对不起,因为我有点卡在那里。我现在读了大约5个例子。是否可以在用户单击我的矩形内并上传照片后以DOM的形式显示图像,并且当单击SUBMIT按钮时从整个表单发送数据,然后在Post方法中将整个数据从表单和图像一起保存到数据库(从实体类)?我正在寻找这样的例子一起工作好... –

回答

2

首先,您不能直接发布到字节数组。因此,您需要一个视图模型来表示正在创建/修改的产品。在您的视图模型,你的文件上传特性应输入为HttpPostedFileBase

public HttpPostedFileBase Image1Upload { get; set; } 
public HttpPostedFileBase Image2Upload { get; set; } 

你的动作后会接受您的视图模型作为PARAM:

[HttpPost] 
public ActionResult CreateProduct(ProductViewModel model) 

这里面的动作,你会在地图将视图模型上的发布值转换为实体类上的相应属性。对于你的上传:

if (model.Image1Upload != null && model.Image1Upload.ContentLength > 0) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     model.Image1Upload.InputStream.CopyTo(ms); 
     product.Image1 = ms.ToArray(); 
    } 
} 

冲洗并重复其他上传。您可能还需要添加一些验证以确保上传的文件实际上是图像,但这只是对读者的练习。

最后,你会保存你的实体正常。

UPDATE

在你更新的代码,您具备以下条件:

<div class="col-xs-offset-2 col-xs-8 add-item-rectangle"> 
    <input type="file" name="@Model.Photo1" id="file"/> 
</div> 

首先,@Model.Photo1会的Model.Photo1仅仅输出值,它甚至无法用一个文件。相反,Razor只需拨打ToString即可获得属性,如name="System.Web.HttpPostedFileBase"。这显然不正确。什么你需要的却是这样的:

<input type="file" name="@Html.NameFor(m => m.Photo1)" id="file" /> 

,或者甚至更好,使用一个辅助生成整个输入:

@Html.TextBoxFor(m => m.Photo1, new { type = "file" }) 
+0

这件事情,对我来说很明显..我在写评论1帖子上面写的主要问题是 –

+0

我没有看到你错过了什么。 –

+0

HttpPostedFileBase类型不允许我使用代码优先方法并创建类型产品的实体集 –

0

服务器端上传正常工作与下面的代码:

<div class="col-xs-offset-2 col-xs-8 add-item-rectangle"> 
     @Html.TextBoxFor(m => m.ItemFormDto.Photo1, new { type = "file" }) 
    </div> 

但是如果我想要在我的矩形内显示上传的图像呢? (用JavaScript - 有可能吗?)。下面的图片是如何它现在看起来:

enter image description here

有一个按钮,但我想: 1)整个矩形是acrea时,如果用户点击了 - 他可以添加照片(如果没有这个按钮“选择文件” 2)刚上传后我想在矩形内显示这张照片的缩图。