使用控制器进行Blob存储

时间:2014-10-14 03:37:24

标签: asp.net-mvc azure asp.net-mvc-5 azure-storage-blobs

我一直在关注此主题using-azure-blobs-with-azure-website

中发布的几个教程

我遇到的麻烦既没有详细介绍如何显示Blob容器的内容。

我的目标是为要上传文件的资产列表中的每条记录创建一个容器。当您转到资产的详细信息视图时,您将看到该资产的容器中的文件列表以及上传更多文件的表单。

我创建了一个AssetsDocs控制器(没有模型)来处理上传文件的操作,并将表单添加到Asset详细信息视图中以选择文件并调用上传操作。这适用于单步执行代码(我尚未将其发布到Azure)。

为了查看文件,我试图添加代码以获取Asset控制器的Details Action中的文件列表,但我无法弄清楚如何将列表传递到视图中。这是资产控制器中的详细信息操作代码:

// GET: Assets/Details/5
public ActionResult Details(int? id)
{
    // Retrieve a reference to a container 
    CloudBlobContainer blobContainer =
        _myBlobStorageService.GetCloudBlobContainer();

    List<string> docs = new List<string>();

    // Loop over blobs within the container and output the URI to each of them
    foreach (var blobItem in blobContainer.ListBlobs())
        docs.Add(blobItem.Uri.ToString()); 

    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Asset asset = db.Assets.Find(id);
    if (asset == null)
    {
        return HttpNotFound();
    }

    return View(asset);
}

我的另一个想法是添加代码以在AssetDocs控制器的Index操作中获取文件列表并创建局部视图,但是我无法弄清楚如何创建局部视图并从控制器传递列表然后从资产的详细信息视图中调用它。

这是AssetDoc控制器中的Index操作:

    // GET: AssetDocs
    public ActionResult Index()
    {
        // Retrieve a reference to a container 
        CloudBlobContainer blobContainer =
            _myBlobStorageService.GetCloudBlobContainer();

        List<string> docs = new List<string>();

        // Loop over blobs within the container and output the URI to each of them
        foreach (var blobItem in blobContainer.ListBlobs())
            docs.Add(blobItem.Uri.ToString());

        return View(docs);
    }

当我创建没有模型的索引视图时,页面为空白,我看不到引用文档。

那么,是否可以将列表传递给Asset Controller中的Detail视图,如果是这样的话?或者如果我沿着局部视图,如何将列表传递给索引视图并从“资产详细信息”视图中调用它?

1 个答案:

答案 0 :(得分:1)

通常您会使用模型创建视图。至少我是如何做到这一点的。但是,缺少这一点,你可以使用动态 ViewBag 变量将其传递给视图。我个人不喜欢这种方法(更喜欢强类型的模型),但它非常方便。

因此,在Asset控制器中,您可以将文档存储到ViewBag的属性中,并像往常一样返回视图。

ViewBag.Docs = docs;

在Razor视图中,您可以执行以下操作来显示文件。

<ul>
    @foreach (string doc in ViewBag.Docs)
    {
         <li>@doc</li>
    }
</ul>