Как вывести динамический запрос Massive ORM в MVC 3 View? - PullRequest
3 голосов
/ 07 октября 2011

Когда я использую Massive ORM для извлечения записи с помощью метода .Find (), он возвращает объект Massive.DynamicModel.Query, который не очень хорошо уживается с ASP.MVC 3 View.

Контроллер:

public ViewResult Details(int id)
{
    // Massive ORM Find syntax requires this next statement to use 'dynamic' not 'var'
    dynamic table = new Things();

    // Thing will return as type Massive.DynamicModel.Query
    var Thing = table.Find(ThingId:id); 

    return View(Issue);
}

В представлении я пробовал и @model dynamic, и @model Massive.DynamicModel.Query, но ни один из них не позволит мне получить доступ к свойствам моего объекта 'Thing' с помощью обычного синтаксиса @ Model.Name.

Здесь обсуждается, как обрабатывать ExpandoObjects с представлениями MVC3, но ничего особенного в реализации Massive.DynamicModel.Query, которая до сих пор работала для меня.

Есть общие идеи, как преобразовать объект Massive.DynamicModel.Query во что-нибудь напечатанное?

Ответы [ 4 ]

4 голосов
/ 07 октября 2011

Два слова: Просмотр моделей . Строго типизированные модели представления, это то, что вы должны передавать своим представлениям. Не динамика, не раскрытие, не анонимные объекты, не ViewData, не ViewBag => только строго типизированные модели представления. Поэтому начните с определения модели представления, которая будет представлять данные, с которыми будет работать это представление. Затем сделайте так, чтобы действие вашего контроллера выполнило необходимое для того, чтобы преобразовать все ваши репозитории в модель представления, которая будет передана в представление.

При несоблюдении этого основного правила ваш опыт ASP.NET MVC может быстро превратиться в кошмар.

1 голос
/ 07 октября 2011

Я думаю, что самый простой способ - использовать ViewBag, потому что он уже динамический.

Вы бы лучше посмотрели производство, потому что оно о самоуверенном пути развития Роба, а не о MVC 3, и описываетиспользуя Massive и другие инструменты Rob.

Но даже если вы не уверены, что посмотрите пример кода здесь для производства (бесплатно), чтобы увидеть, как он интегрирует Massive в MVC 3:

https://github.com/tekpub/mvc3

Вы можете видеть, как выглядит его производственный контроллер.Довольно интересные способы.

0 голосов
/ 29 октября 2011

Поскольку анонимный тип всегда аннотируется как «внутренний», вы не можете получить доступ к экземпляру динамического типа из View, так как они находятся в разных областях.

Я считаю, что лучший способ заставить его работать, чем использование ViewBag. И ответ: Mono.Cecil . Хватайте это под рукой от NuGet .

С помощью Mono.Cecil вы можете изменить код MSIL, сгенерированный из вашего проекта ASP.NET MVC, и изменить доступный модификатор типа на «public».

Я пишу небольшую консольную программу и размещаю ее на GitHub .

Вы можете вызвать программу из командной строки или добавить событие после сборки в события сборки вашего проекта ASP.NET MVC:

"$(SolutionDir)DynamicHelper\bin\Debug\DynamicHelper.exe" "$(TargetPath)"

ВНИМАНИЕ: «DynamicHelper» - это имя проекта кода, и вы можете изменить его в зависимости от вашей ситуации.

0 голосов
/ 12 октября 2011

Я сейчас экспериментирую с динамикой и Massive.Я использую динамическую viewModel:

   public ActionResult Index() {
        _logger.LogInfo("In home");
        dynamic viewModel = new ExpandoObject();
        var data = _tricksTable.Query("SELECT TOP(10) * FROM Tricks ORDER BY DateCreated DESC");
        viewModel.TenTricksNewestFirst = data;

        var data2 = _tricksTable.Query("SELECT TOP(10) * FROM Tricks ORDER BY Votes DESC");
        viewModel.TenTricksMostPopularFirst = data2;
        return View(viewModel);
    }

На мой взгляд, нет ссылки на что-либо строго напечатанное в первой строке, например, НЕ ЭТО:

@model IEnumerable<MvcApplication2.Models.Thing>

, поэтому, на мой взгляд, яделайте что-то вроде этого:

@foreach (var item in Model.TenTricksNewestFirst) {
              <div class="post block">
                <div class="tab-image-block">
                    <a href="/tricks/@URL.MakeSpacesMinuses(@item.Name)" title="@item.Name">

                        <img src="/public/images/@item.Thumbnail" alt="@item.Name" class="woo-image thumbnail" /></a>
                </div>
                <h2 class="title">
                    <a href="/video/uncross-your-arms" rel="bookmark" title="@item.Name">@item.Name</a></h2>
                <span class="date">@Dates.ShortDate(@item.DateCreated)</span>
                <span class="likes">Likes: @item.Votes</span>
               </div>
            }

Опыт пока таков, что я пишу намного меньше кода.

...