MVC3将来自ctrl的附加数据传递给视图

Kas*_*kov 2 .net viewdata razor asp.net-mvc-3

如果我将其他数据(模型除外)传递到我的视图中,比如说来自特定文件夹的文件列表,那么最好的方法是什么?

我正在考虑制作方法并将列表返回到ViewData:

        public List<string> GetFiles(int id, string cat)
    {
        var files = new List<string>();

        var folder = "~/App_Data/uploads/" + cat + "/" + id.ToString();
        foreach (var file in Directory.GetFiles(folder))
        {
            files.Add(file);
        }
        return files;
    }
Run Code Online (Sandbox Code Playgroud)

控制器:

ViewData["files"] = db.GetFiles(id, "random");
Run Code Online (Sandbox Code Playgroud)

风景:

@foreach (var item in ViewData["files"]){ //markup }
Run Code Online (Sandbox Code Playgroud)

首先,我听说不应该使用viewdata和viewbag.其次,这段代码不起作用.Viewdata对象的某些内容不可枚举.我应该为这些文件创建一个模型类.如果是这样,怎么样?一个视图中有2个型号?我有点困惑如何做到这一点.

Dar*_*rov 5

如果我将其他数据(模型除外)传递到我的视图中,比如说来自特定文件夹的文件列表,那么最好的方法是什么?

编写一个视图模型,其中包含视图所需的所有属性,并让控制器操作将此视图模型传递给视图.所以:

public class MyViewModel
{
    public List<string> Files { get; set; }

    public string Foo { get; set; }

    ... some other properties that your view might need
}
Run Code Online (Sandbox Code Playgroud)

那么控制器:

public ActionResult Index(int id)
{
    var model = new MyViewModel
    {
        Files = db.GetFiles(id, "random"),
        Foo = "bar"
    };
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

最后在你的强类型视图中:

@model MyViewModel
@foreach (var file in Model.Files)
{
    <div>@file</div>
}

<div>@Html.DisplayFor(x => x.Foo)</div>
Run Code Online (Sandbox Code Playgroud)