читать неявный тип возврата в Razor MVC View - PullRequest
1 голос
/ 24 ноября 2011

Я новичок в бритве MVC, и мне интересно, как я могу прочитать значения, которые я возвращаю в представлении?

Мой код такой:

    public ActionResult Subject(int Category)
    {
        var db = new KnowledgeDBEntities();
        var category = db.categories.Single(c => c.category_id == Category).name;
        var items = from i in db.category_items
                    where i.category_id == Category
                    select new { ID = i.category_id, Name = i.name };
        var entries = from e in db.item_entry
                      where items.Any(item => item.ID == e.category_item_id)
                      select new { ID = e.category_item_id, e.title };
        db.Dispose();


        var model = new { Name = category, Items = items, Entries = entries };
        return View(model);
    }

В основном, я возвращаю анонимный тип, какой код мне нужно написать, чтобы прочитать значения анонимного типа в моем представлении?

И если это невозможно, какой будет подходящая альтернатива?

1 Ответ

2 голосов
/ 24 ноября 2011

По сути, я возвращаю анонимный тип

Нет.Не сработаетАнонимные типы выводятся компилятором как internal , и поскольку ASP.NET компилирует ваши представления в отдельные сборки во время выполнения, они не могут получить доступ к тем анонимным типам, которые существуют в сборке, которая их определила.

В правильно разработанном приложении ASP.NET MVC вы работаете с моделями представлений.Итак, вы начинаете с определения некоторых:

public class MyViewModel
{
    public string CategoryName { get; set; }
    public IEnumerable<ItemViewModel> Items { get; set; }
    public IEnumerable<EntryViewModel> Entries { get; set; }
}

public class ItemViewModel
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class EntryViewModel
{
    public int ID { get; set; }
    public string Title { get; set; }
}

, а затем адаптируете действие контроллера для передачи этой модели представления в представление:

public ActionResult Subject(int Category)
{
    using (var db = new KnowledgeDBEntities())
    {

        var category = db.categories.Single(c => c.category_id == Category).name;
        var items = 
            from i in db.category_items
            where i.category_id == Category
            select new ItemViewModel 
            { 
                ID = i.category_id, 
                Name = i.name 
            };

        var entries = 
            from e in db.item_entry
            where items.Any(item => item.ID == e.category_item_id)
            select new EntryViewModel 
            { 
                ID = e.category_item_id, 
                Title = e.title 
            };

        var model = new MyViewModel 
        { 
            CategoryName = category, 
            Items = items.ToList(),      // be eager
            Entries = entries.ToList()   // be eager
        };
        return View(model);
    }
}

и, наконец, вы строго вводите свое представление впросмотреть модель, которую вы определили:

@model MyViewModel

@Model.Name

<h2>Items:</h2>
@foreach (var item in Model.Items)
{
    <div>@item.Name</div>
}

<h2>Entries:</h2>
@foreach (var entry in Model.Entries)
{
    <div>@entry.Title</div>
}

Кстати, чтобы упростить сопоставление между моделями доменов и моделями просмотра, я бы порекомендовал вам проверить AutoMapper .

Ohи поскольку написание foreach циклов в представлении выглядит некрасиво и не может использоваться повторно, я бы порекомендовал вам использовать шаблоны отображения / редактирования, которые в основном заставили бы вас выглядеть так:

@model MyViewModel

@Model.Name

<h2>Items:</h2>
@Html.DisplayFor(x => x.Items)

<h2>Entries:</h2>
@Html.DisplayFor(x => x.Entries)

, а затем вы должны определитьсоответствующие шаблоны отображения, которые будут автоматически отображаться для каждого элемента соответствующих коллекций:

~/Views/Shared/DisplayTemplates/ItemViewModel:

@model ItemViewModel
<div>@item.Name</div>

и ~/Views/Shared/DisplayTemplates/EntryViewModel:

@model EntryViewModel
<div>@item.Title</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...