如何在编辑页面ASP.NET MVC中为HttpPostedFileBase创建输入类型文件?

时间:2014-02-26 13:47:19

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

我在开发MVC应用程序时遇到了一个问题。

我从简单模型开始,用于视图,例如:

public class MyModel 
{
    public HttpPostedFileBase[] Files { get; set; }

    public string Name { get; set; }
}

我有一个视图(Create.aspx)

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyModel>" %>
...
    <form method="post" action="/My/Create" enctype = "multipart/form-data">
        <input type="file" name="Files" />
        ...
        <%:Html.TextBoxFor(item=>item.Name) %>
        <input type="submit" value="Create" />
    </form>

控制器:

public class ActionController: Controller {
    public ActionResult Create() {  
        var myModel = new MyModel(); 
        return View(model); 
    }

    [HttpPost]
    public ActionResult Create(MyModel model) {
        if(ModelState.isValid) { /* save */ }
    }

    public ActionResult Edit(int id) {  
        var myModel = _manager.Get(id);
        myModel.Files = /* what to do here ? */ 

        return View(model); 
    }

    [HttpPost]
    public ActionResult Edit(MyModel model) {
        if(ModelState.isValid) { /* edit */ }
    }
} 

我的问题:如何创建要发送的HttpPostedFileBase对象来查看和显示它们(参见下面的编辑页面)?

文件作为nvarchar存储在数据库中,并具有相对路径(作为标签)。

我想保留已保存的文件,只需更改名称字段。

从数据库中我收到一个存储文件路径,文件类型和文件流的对象。

对于编辑aspx页面:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyModel>" %>
...
    <form method="post" action="/My/Edit" enctype = "multipart/form-data">
        <input type="file" name="Files" />
        /* display here the files */
        ...
        <%:Html.TextBoxFor(item=>item.Name) %>
        <input type="submit" value="Create" />
    </form>

2 个答案:

答案 0 :(得分:4)

您无法使用HttpPostedFileBase来显示文件。 正如其描述所示:

用作提供对客户端上传的单个文件的访问权限的类的基类。

用于访问正在上传的文件。如果要显示已上传的文件,则必须使用其他方法,例如使用文件方法

答案 1 :(得分:0)

您可以使用以下示例代码在视图中显示文件:

    public FileContentResult ViewImage(/*parameters*/)
    {
        byte[] img = //TODO: take your image as byte array
        return new FileContentResult(img, "image/jpeg");
    }

和您的view

<img src="@Url.Action("ViewImage", "ControllerName", new { @*parameters*@ })">

但如果您只想在上传之前预览文件,则必须使用以下内容:

<强> HTML:

<p>Please specify an image file: <input type="file" name="datafile" id="datafile" size="40"></p>
<div id="preview"><img height="240" /></div>

<强> JS:

$(function() {
   $('#datafile').change(function(e)
       {
           e.preventDefault();
           var f = e.target.files[0];
           if(f && window.FileReader)
           {
               var reader = new FileReader();
               reader.onload = function(evt) { $('#preview>img').attr('src', evt.target.result); };
               reader.readAsDataURL(f);
           }
       }
   );
});

<强> FIDDLE