Показаны сообщения с ярлыком MVC. Показать все сообщения
Показаны сообщения с ярлыком MVC. Показать все сообщения

вторник, 27 апреля 2010 г.

MVC.Многостраничный просмотр таблицы.

Задача сводится к следующему. При выводе данных в окно браузера ограничиться некоторым количеством записей из таблицы, чтобы помещалось на экране. А тажке соорудить навигацию для доступа к невидимой части.
"MVC PageIndex" - запрос к Google.
Решение очень быстро нашлось. http://en.webdiyer.com/ . Абсолютно бесплатный модуль. Есть очень понятные примеры. http://en.webdiyer.com/MvcPager/Demo/StandardТак как я использую сначала фильтр, а потом уже вывожу данные, то вот мой измененный код:

Function Consumable(ByVal id1 As Integer?) As ActionResult
 Dim Datacontext As New PrintModelDataContext
 Dim ListConsumables As IQueryable(Of ClassConsumable)
 ListConsumables = From c In Datacontext.consumable, p In Datacontext.Printer _
                  Where c.Id_printer = p.Id _
                  Select New ClassConsumable _
                             With {.Id = c.Id, _
                                   .Naim = c.Naim, _
                                   .Part_number = c.Part_number, _
                                   .Revolving = c.Revolving, _
                                   .Count = c.Count, _
                                   .NaimPrinter = p.Naim}
 Return View(ListConsumables.ToPagedList(IIf(id1 Is Nothing, 1, id1), 20))
End Function


Мне пришлось создать новый класс, который является неким объединением двух таблиц Consumable и Printer. Ну а в представлении я абсолютно точно копирую из оригинала. Только перевожу в синтаксис языка  VB

<%=Html.Pager(Of print.ClassConsumable)(Model, New PagerOptions With {.PageIndexParameterName = "id1"})%>

И еще полезно будет в Web.config в каталоге VIEW внести строчку

<namespaces>
<add namespace="Webdiyer.WebControls.Mvc"/>
</namespaces>

Чтоб метод Pager был доступен в каждой странице проекта.

пятница, 19 марта 2010 г.

MVC. Html.DropDownList

Эта тема перекликается с описанной в прошлом посте. Но теперь хочется, чтобы при редактировании и добавлении новой записи, вместо идентификаторов-ссылок на первичные ключи был выбор ввиде выпадающего списка. То есть вместо Html.TextBox используем Html.DropDownList. Вот код в контроллере:

Function CreateSpecific() As ActionResult
Dim Datacontext As New PrintModelDataContext
Dim PrinterList As IList
PrinterList = (From p In Datacontext.Printer Select ID = p.Id, Naim = _ p.Naim).ToList
ViewData("PrinterList") = New SelectList(PrinterList, "ID", "Naim")
Return View()
End Function

А теперь используем список всех принтеров для выбора поля ID_Printer в таблице Specific в представлении:

<%=Html.DropDownList("Id_printer", CType(ViewData("PrinterList"), SelectList)%>

Если у нас есть логическое поле в таблице, то для него тоже можно использовать HTML.DropDownList.
Например в контроллере создаем список:

Dim YesNo As New List(Of SelectListItem)
YesNo.Add(New SelectListItem With {.Value = Boolean.Parse("True"), _
.Text = "ДА",  .Selected = Boolean.Parse("True")})
YesNo.Add(New SelectListItem With {.Value = Boolean.Parse("False"),_
.Text = "НЕТ", .Selected = Boolean.Parse("True")})
ViewData("YesNo") = New SelectList(YesNo, "Value", "Text")

А в представлении код тот же:

<%=Html.DropDownList("Boolean", CType(ViewData("YesNo"), SelectList)) %>
 

MVC. Выводим в представлениях вместо ID - наименования.

Продолжаем работать над MVC приложением. Конечно при отображении значений полей в записи таблицы,  хотелось бы видеть не идентификаторы-ссылки на другую таблицу ,связанную отношениями, а их смысловые значения. Допустим есть  первичная таблица Printer (Это таблица моделей принтеров).  Вот как выглядит контроллер для отображения этой таблицы .

Function Printer() As ActionResult
Dim Datacontext As New PrintModelDataContext
Dim List = From p In Datacontext.Printer Select p
Return View(List.ToList)
End Function

Потом в одноименном представлении (строго-типизированном) мы в цикле выводим колонки записи таблицы.

<%For Each item In Model%>
<%= Html.Encode(item.Naim) %>
<%= Html.Encode(item.Part_number) %>
<%= Html.Encode(item.Manufactory) %>
<%Next%>

А вот выводим дочернюю таблицу Specific:

Function Specific() As ActionResult
  Dim Datacontext As New PrintModelDataContext
  ViewData("Specific") = _
  From s In Datacontext.Specific, _
    p In Datacontext.Printer, _
    f In Datacontext.Filial _
   Where s.Id_Printer = p.Id And s.Id_Filial = f.Id _
   Select s.Id, s.Inv, s.SN, NaimPrinter = p.Naim,_
    NaimFilial = f.Naim
   Return View()
End Function

В представлении мы уж используем Viewdata("Specific") вместо Model.
В этом случае Intellisense уже вам не подскажет.

<%For Each item In ViewData("Specific")%>
<%=Html.Encode(item.NaimPrinter)%>
<%= Html.Encode(item.SN)%>
<%= Html.Encode(item.Inv)%>
<%=Html.Encode(item.NaimFilial)%>
<% Next%>

Вместо поля числового поля ID_printer Выводиться NaimPrinter из таблицы Printer, вместо ID_Filial - NaimFilial