MVC - 从Azure httppost

时间:2016-04-07 19:02:15

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

我遇到一个问题,我无法返回上传到网站并存储在Azure上的文件的文件名和文件大小,即使控制器中存在变量名称。

我的CSHTML片段如下所示:

<table class="table table-striped table-hover ">  
<thead>
<tr>
    <th>FIlename</th>
    <th>Modified</th>
    <th>File Size</th>
    <th>Download File</th>
    <th>Delete File</th>
    </tr>
</thead>

<tbody>
@foreach (var item in Model)
{
<tr>
    <td>@item.Name</td>
    <td>Modified</td>
    <td>@item.ContentLength</td>
    <td><a id="@item" href="@item" onclick="downloadFile('@item')">Download</a></td>
    <td><a id="@item" href="#" onclick="deleteFile('@item')">Delete</a></td>
</tr>
}
</tbody>
</table>

正如你所看到的,我有item.Name但是我已经尝试了很多其他的,我将在下面总结一下我尝试过的所有内容。值得注意的是,我能够完全下载和删除文件。

我最重要的控制器部分是:

public class HomeController : Controller
{

    BlobStorageService _blobStorageService = new BlobStorageService();

    public ActionResult Upload()
    {
        CloudBlobContainer blobContainer = _blobStorageService.GetCloudBlobContainer();
        List<string> blobs = new List<string>();
        foreach (var blobItem in blobContainer.ListBlobs())
        {
            blobs.Add(blobItem.Uri.ToString());
        }
        return View(blobs);
    }

    [HttpPost]
    public ActionResult Upload(HttpPostedFileBase file)
    {
        if (file.ContentLength > 0)
        {
            CloudBlobContainer blobContainer = _blobStorageService.GetCloudBlobContainer();
            CloudBlockBlob blob = blobContainer.GetBlockBlobReference(file.FileName);
            blob.UploadFromStream(file.InputStream);
        }
        return RedirectToAction("Upload");
    }

如您所见,ContentLength是文件大小,FileName存在于HomeController上下文中。

我尝试了以下不同的例子以使其正常工作

@ item.FileName,@ item.file.FileName,@ item.HttpPostedFileBase.Filename @ file.FileName,@ item.filename - 和其他人一样。

如果你确实知道答案,你能告诉我你找到它的地方的来源吗,我已经习惯使用Python了解其模块的文档,但这是完全不同的

1 个答案:

答案 0 :(得分:0)

问题在于您用于呈现GET上传视图的ViewModel。

[HttpGet]
public ActionResult Upload() {      
    List<string> blobs = new List<string>();
    // add URI strings to list ...
    return View(blobs, "Upload");
}

这意味着在您的CSHTML中,ModelList<string>

您真正想要的是一组包含FileName和ContentLength的视图模型,而不仅仅是URI。

public class FileDisplayModel {
    public string Uri { get; set; }
    public string Name { get; set; }
    public int ContentLength { get; set; }
}

在cshtml中使用@model指令允许IDE检查您是否从控制器传递了正确的模型。

@* Upload.cshtml *@
@model IList<FileDisplayModel>

.net的文档可以在MSDN上找到:HttpPostedFileBase Class

以下是我用于图片上传的教程:File Uploads in ASP.NET MVC with View Models