LINUX.ORG.RU

Волей судеб пришлось пробовать asp.net mvc4

 asp.net mvc 4


0

1
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    var query =
        from product in context.Products
        select new
        {
            ProductId = product.ProductID,
            ProductName = product.Name
        };
}

Как мне теперь вывести результат в шаблон? Бьюсь с приведением типов. Если возвращать через ViewBag - невозможно получить значение по ProductId.
Пример взят с msdn, но случай тот же.



Последнее исправление: matroskin (всего исправлений: 1)

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

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    var query =
        from product in context.Products
        select new
        {
            ProductId = product.ProductID,
            ProductName = product.Name
        };
return View(query.ToList());
}

eternity
()
Ответ на: комментарий от eternity

Вот в принципе к такому решению и пришел.
Запрос

OMNITRACKEREntities context = new OMNITRACKEREntities();

        public ActionResult Index()
        {
            var WorckGroup =
                (from Group in context.V_ServiceCalls_1049
                where Group.РабочаяГруппа != null && Group.Специалист != null
                select new WorckGroups
                {
                    РабочаяГруппа = Group.РабочаяГруппа,
                    Специалист = Group.Специалист
                }).Distinct().OrderBy(c => c.РабочаяГруппа);
            return View(WorckGroup);
        }
Код класса WorckGroups
public class WorckGroups
    {
        public string Специалист { get; set; }
        public string РабочаяГруппа { get; set; }
    }
И сам View
@{
    Layout = null;
}
@model IEnumerable<OMNIWebReports.Models.WorckGroups>
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        @foreach (var p in Model)
        {
            @p.РабочаяГруппа @p.Специалист <br>
        }
    </div>
</body>
</html>
После Django это немного калечит мозг. Пока еще не придумал как возвращать GroupBy.

matroskin
() автор топика
Ответ на: комментарий от matroskin

немного калечит мозг

На мой взгляд это самый адекватный веб-фреймворк...

Еще замечание - Вы возвращаете во вьюху IQueryable. Это отложенное выполнение запроса - начинает выполняться в тот момент, когда дело доходит непосредственно до получения данных - в Вашем случае это foreach. Если напишете, к примеру, такой foreach 2 или более раз, то запрос к источнику данных будет каждый раз выполняться. Некоторые так делают, но я избегаю такой практики, так как трудно уследить. В моем примере выше я явно получаю данные и кладу их в список.

eternity
()
Ответ на: комментарий от eternity

Можно еще вопрос? Если мне нужно сделать несколько select`ов в одном контроллере, то как правильно их передать на view?

matroskin
() автор топика
Ответ на: комментарий от matroskin

После Django это немного калечит мозг

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

umren ★★★★★
()
Ответ на: комментарий от matroskin

несколько select`ов в одном контроллере

Не совсем понятно, что имеется ввиду, но если я правильно понял, то нужно результаты этих селектов запихнуть в одну ViewModel и ее передавать в вьюху. То есть view model будет иметь несколько свойств, каждое из которых - коллекция.

eternity
()
Ответ на: комментарий от eternity

спасибо большое.
теперь проблема с связыванием extjs и mvc4
самый простой пример ajax не работает, я так понимаю, что не может разобрать структуру json

Ext.onReady(function () {
            Ext.define('myModel', {
                extend: 'Ext.data.Model',
                fields: ['РабочаяГруппа', 'Специалист']
            });

            var store = Ext.create('Ext.data.Store', {
                model: 'myModel',
                proxy: {
                    type: 'ajax',
                    url: '/omnireports/ajaxgrid',
                    reader: {
                        type: 'json',
                        root: 'array'
                    }
                },
                autoLoad: true
            });

            var grid = Ext.create('Ext.grid.Panel', {
                store: store,
                columns: [
                {
                    text: 'РабочаяГруппа',
                    dataIndex: 'РабочаяГруппа'
                },
                {
                    text: 'Специалист',
                    dataIndex: 'Специалист'
                },
                ],
                height: 350,
                width: 600,
                title: 'Простейшая статическая таблица grid',
            });

        });

контроллер

        public JsonResult AJAXGrid()
        {
            IEnumerable<AJAXTest> test = (from wosp in context.V_ServiceCalls_1049
                                          where (wosp.РабочаяГруппа != null && wosp.Специалист != null)
                                          select new AJAXTest
                                          {
                                              РабочаяГруппа = wosp.РабочаяГруппа,
                                              Специалист = wosp.Специалист
                                          })
                                          .Distinct()
                                          .OrderBy(c => c.РабочаяГруппа)
                                          .ToList();

            return Json(test, JsonRequestBehavior.AllowGet);
        }
получаю json такого формата
[{"РабочаяГруппа":"Группа поддержки 3D","Специалист":"А В"},{"РабочаяГруппа":"Группа поддержки 3D","Специалист":"А К"}]
и на листе ничего не появляется. запрос отправляется, ответ получается, но json не разбирается. предполагаю, что из за неправильного определения параметра
root: 'array '
как обратится к неименованному json массиву? или оборачивать модель AJAXTest в еще один класс только для того, что бы присвоить имя массиву?

matroskin
() автор топика
Ответ на: комментарий от matroskin

На стороне сервера ничего не надо менять - копайте в ExtJS коде - для начала можно попробовать вообще убрать root - он вроде бы тут не нужен. Вот ссылка в тему еще, если не получится http://www.sencha.com/forum/showthread.php?138966-Ext.data.JsonReader-root-pr...

eternity
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.