Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Necromant1k
0 / 0 / 0
Регистрация: 15.05.2014
Сообщений: 67
1

2 модели одно представление

23.11.2015, 14:39. Просмотров 982. Ответов 7
Метки нет (Все метки)

Привет.
прошу помощи советом
Как можно сделать , чтобы при просмотре деталей(допустим сотрудники) , отображалась информация из табл. сотрудники и из таблицы (допустим должность ). Сотрудники( код_сотр - primarykey ), Должность ( код_сотр - fk)
Пытался сделать через 2 модели
@model ....Сотрудники
@model ....Должность
но допускается только одна модель на представление
Нужна помощь
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2015, 14:39
Ответы с готовыми решениями:

Несколько моделей в одно представление
Подскажите пожалуйста, как исправить ошибку... Invalid object name...

Передача двух моделей в одно представление
Всем привет! Возможно ли как-то реализовать такую конструкцию: @model...

Два контроллера одно частичное представление
Всем привет! У меня два контроллера и для них я создала частичное...

Как вывести содержимое двух таблиц на одно представление
Как вывести содержимое двух таблиц на одно представление, из одной я вывожу...

Как передать из одного контроллера объект модели в строго типизированное представление другого контроллера
Есть строго типизированное представление в контроллере Main, в методе...

7
Metall_Version
2118 / 1255 / 516
Регистрация: 04.03.2014
Сообщений: 4,094
Завершенные тесты: 2
23.11.2015, 17:22 2
Лучший ответ Сообщение было отмечено Metall_Version как решение

Решение

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

C#
1
2
3
4
5
public class MyModel
{
  public List<Employee> Employees {get;set;}
  public List<Position> Positions{get;set;}
}
HTML5
1
@model MyModel
0
XIST
1056 / 781 / 112
Регистрация: 01.10.2009
Сообщений: 2,431
Записей в блоге: 1
23.11.2015, 20:14 3
А вот направьте на путь истинный, похожая ситуация, только мне нужно выводить заглавие + текст к заглавию и комменты. Все хорошо, но мне нужно сделать пагинацию комментов. Была моделька с ссылкой на список комментов. Я создал модельку из двух списков мне необходимых, но теперь в представлении, не могу понять как выводить, т.е. было.
HTML5
1
@ModelType project.News
и вывод
HTML5
1
@Model.Title
сделал
HTML5
1
@ModelType PagedList.IPagedList(Of project.News)
ругается на @Model.Title, пробовал и @Model.MyList.Title и по другому

или мой подход не верный в корне?
0
Metall_Version
2118 / 1255 / 516
Регистрация: 04.03.2014
Сообщений: 4,094
Завершенные тесты: 2
25.11.2015, 00:16 4
Цитата Сообщение от XIST Посмотреть сообщение
или мой подход не верный в корне?
IPagedList это коллекция, коллекция элементов типа News в данном случае, заголовков столько же сколько и объектов в коллекции, какой вам нужен?

или вы выводите все элементы коллекции, в foreach или в for , соответсвенно по индексу (или по имени текущего элемента в foreach) нужно обращаться к элементу коллекции
0
XIST
1056 / 781 / 112
Регистрация: 01.10.2009
Сообщений: 2,431
Записей в блоге: 1
25.11.2015, 11:59 5
Metall_Version, хорошо, есть модель
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Imports System.ComponentModel.DataAnnotations
 
Public Class NewsComm 'class for pagination comments
    Public Property NewsList As ICollection(Of News) = New List(Of News)
    Public Property Comments As ICollection(Of Comment)
End Class
 
 
Public Class News ' новости
 
    Public Property Id As Integer
    <StringLength(300)>
    Public Property Title As String 
 
Public Class Comment 'комментарий к новости
    Public Property Id As Integer
 
    Public Property News As News 
    Public Property NewsId As Integer?
 
    Public Property Text As String 
End Class
я выводил обычной моделькой
HTML5
1
2
3
<div class="post">
    <div class="title">
       <h2><a href="#">@Model.Title</a></h2>
+ комменты

HTML5
1
2
3
4
5
6
7
 <ul>
        @For Each c In Model.Comments
            @<li>
                <div>@(New HtmlString(c.Text))</div>            
            </li>
        Next
    </ul>
не теперь требуется пагинация комментов


@ModelType PagedList.IPagedList(Of project.NewsComm)

тогда не одно поле не выводит. Или может лучше через PartialView? запутался
0
IamRain
1312 / 1200 / 371
Регистрация: 02.08.2011
Сообщений: 3,486
25.11.2015, 15:22 6
Комменты убрать из модели и сделать отдельную ViewModel для них.
При загрузке очередной новости вызывать childaction комментов из вьюхи новостей.
И по ajax-у делать вашу постраничную навигацию, передавая каждый раз Id текущей новости.
0
XIST
1056 / 781 / 112
Регистрация: 01.10.2009
Сообщений: 2,431
Записей в блоге: 1
25.11.2015, 17:08 7
Это лучше чем, иметь во вьюхе комменты к новости? Есть же Epagelist, зачем использовать Ajax?
А можно маленький пример с Ajax
0
IamRain
1312 / 1200 / 371
Регистрация: 02.08.2011
Сообщений: 3,486
25.11.2015, 18:12 8
Цитата Сообщение от XIST Посмотреть сообщение
Это лучше чем, иметь во вьюхе комменты к новости?
Вы упрощаете модель, делаете код более модульным, я бы сказал. Microsoft тоже ведь вслед за OWIN спецификацией взяли и переписали весь ASP стек, сделали его более модульным.

Вы просто грузите новость, первый раз во вьюхе новости отрабатывает Child action и грузит комментарии с первой страницы. Во вьюхе модели также генерите ваш PageList контрол, который будет асинхронно выполнять навигацию.
Цитата Сообщение от XIST Посмотреть сообщение
А можно маленький пример с Ajax
Сейчас лень писать заново. Просто кусок со старого проекта сброшу. Тут еще фильтрация была, так что кода чуть бульше, чем ожидается.
Вьюха:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
@if (Model.Payments.Any())
{       
    <table id="tablepager">
        <tr>
            <td>@Html.PagedListPager(Model.Payments, pagenumber => Url.Action("PaymentsHistory", "Member", new RouteValueDictionary
            {{"userName", Model.UserName},
            {"pageNumber", pagenumber},
            {"filterName", ViewBag.FilterName},
            {"fminval", ViewBag.FilterMinVal},
            {"fmaxval", ViewBag.FilterMaxVal},
            {"displayComment", ViewBag.DisplayComment}
        }), PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(
            new PagedListRenderOptions
            {
                DisplayLinkToFirstPage = PagedListDisplayMode.Always,
                DisplayLinkToLastPage = PagedListDisplayMode.Always,
                DisplayLinkToPreviousPage = PagedListDisplayMode.Always,
                DisplayLinkToNextPage = PagedListDisplayMode.Always,
                DisplayEllipsesWhenNotShowingAllPageNumbers = false,
                MaximumPageNumbersToDisplay = 2,
                DisplayLinkToIndividualPages = true,
                DisplayPageCountAndCurrentLocation = true,
                Display = PagedListDisplayMode.Always,
                PageCountAndCurrentLocationFormat = "Страница {0} из {1}"
            }, new AjaxOptions { UpdateTargetId = "paymentshistory", HttpMethod = "post", OnComplete = "onFailedMethod" }))</td>
            <td>Общее число платежей: @Model.PaymentsCount</td>
        </tr>
    </table>
        <table id="paymentsstory">
                <thead>
                    <tr>
                        <th>Дата и время платежа</th>
                        <th>Сумма платежа</th>
                        <th>Способ оплаты</th>
                        @if (Model.DisplayComment){ <th class="optCol">Комментарий к платежу</th>}
                    </tr>
                </thead>
                <tbody>
                    @foreach (BusinessPayment item in Model.Payments)
                    {
                        <tr>
                            <td><span>@item.PaymentDateTime</span></td>
                            <td><span>@item.PaymentValue</span></td>
                            <td><span>@item.PaymentTypeName</span></td>
                            @if (Model.DisplayComment)
                            {
                                <td class="optCol"><span>@item.PaymentComment</span></td>
                            }
                        </tr>
                    }
                </tbody>
            </table>
  }
else
{
    if (!Model.SearchHasBeenRequested)
    {
        <h3>Вы еще не совершали платежей.</h3>
    }
    else
    {
        <h3>По запросу ничего на найдено.</h3>
    }
}
Ну и код возвращающий страницу данных. Думаю этого вам хватит, без лишних деталей.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public Task<ActionResult> PaymentsHistory(
            string username,
            int? pageNumber,
            string searchMinVal,
            string searchMaxVal,
            string fminval,
            string fmaxval,
            bool displayComment = true,
            int filterName = 0)
        {
            return Task<ActionResult>.Factory.StartNew(() =>
            {
                if (!HttpContext.Request.IsAjaxRequest())
                    return null;
 
                var vm = new PaymentsHistoryViewModel {UserName = username, DisplayComment = displayComment};
                int pNumber = pageNumber ?? 1;
                vm.SearchHasBeenRequested = searchMinVal != null || searchMaxVal != null;
                if (vm.SearchHasBeenRequested)
                {
                    pNumber = 1;
                    if (!string.IsNullOrEmpty(searchMinVal))
                        fminval = searchMinVal;
                    if (!string.IsNullOrEmpty(searchMaxVal))
                        fmaxval = searchMaxVal;
                }
 
                ViewBag.FilterMinVal = fminval;
                ViewBag.FilterMaxVal = fmaxval;
                ViewBag.FilterName = filterName;
                ViewBag.DisplayComment = displayComment;
 
                var optionslist = new[]
                {
                    new {Key = 0, Text = CommonResources.PaymentDateTime},
                    new {Key = 1, Text = CommonResources.PaymentValue},
                    new {Key = 2, Text = CommonResources.PaymentComment},
                    new {Key = 3, Text = CommonResources.PaymentType}
                };
 
                ViewBag.Filters = new SelectList(optionslist, "Key", "Text", optionslist[0]);
                vm.Payments = GetPayments(username, filterName, fminval, fmaxval, pNumber);
                return PartialView("Partial/Member/PaymentsHistory", vm);
            });
        }
 
 
private IPagedList<BusinessPayment> GetPayments(string userName, int? filterName, string fminval,
            string fmaxval, int pageNumber, int pageSize = 10)
        {
            IEnumerable<BusinessPayment> resultList = ApplyPaymentsFilter(userName, filterName, fminval, fmaxval);
            return resultList.ToPagedList(pageNumber, pageSize);
        }
Добавлено через 51 минуту
Хотя в принципе с точки зрения правильности проектирования типов можно оставить все как есть. Обратите внимание,
Цитата Сообщение от IamRain Посмотреть сообщение
vm.Payments
Тут тоже коллекция как свойство модели.
В любом случае, вам понадобится отдельный метод действия для комментариев.
Если коллекция является частью модели, то она, по идее, используется только при первой загрузке новости. А при дальнейшей пагинации она, собственно, уже и не нужна.
1
25.11.2015, 18:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2015, 18:12

WebForms отставание модели контролов от объектной в одно действие
Всё просто, есть код: protected void InitialControls() { ...

Элемент модели, переданный в словарь, имеет тип "Int32", но для этого словаря требуется элемент модели типа "Calc"
Текст ошибки: System.InvalidOperationException: Элемент модели, переданный в...

Представление таблиц
Всем добрый день! ситуация следующая: (привожу абстрактный пример для описания...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru