MVC3 Передача дополнительных данных из Ctrl для просмотра - PullRequest
2 голосов
/ 06 сентября 2011

Если бы мне нужно было передать в мое представление дополнительные данные (кроме модели), например, список файлов из определенной папки, каков наилучший способ сделать это?

Я думал о создании метода и возвращении списка в 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;
    }

Контроллер:

ViewData["files"] = db.GetFiles(id, "random");

Вид:

@foreach (var item in ViewData["files"]){ //markup }

Во-первых, я слышал, что viewdata и viewbag не должны использоваться. Во-вторых, этот код не работает. Что-то с объектом Viewdata не перечисляется. Должен ли я сделать модель класса для этих файлов. Если так, то как? 2 модели в одном представлении? Я немного сбит с толку, как сделать это, вероятно,

1 Ответ

5 голосов
/ 06 сентября 2011

Если бы мне нужно было передать дополнительные данные (кроме модели) в мое представление, например, список файлов из определенной папки, каков наилучший способ сделать это?

Напишите модель представления, которая будет содержать все свойства, которые необходимы вашему представлению, и ваш контроллер должен передать эту модель представления представлению.Итак:

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

    public string Foo { get; set; }

    ... some other properties that your view might need
}

затем контроллер:

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

и, наконец, в вашем строго типизированном виде:

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

<div>@Html.DisplayFor(x => x.Foo)</div>
...