MVC - V jak Widok - Listy

Widok - index czyli lista
Widok z samego założenia wzorca projektowego jest zależny od kontrolera, po kolei będą więc przedstawiane przykłady i spostrzeżenia odnośnie obu.
Ponieważ wszystkiego jest dość dużo dlatego podział na listy i edycje.


Widok jest zawsze generowany na podstawie akcji kontrolera.
Wybierając w kontrolerze menu podręczne na jakiejś akcji widzimy opcje Add View.. i Go to View.
Kolejne okno umożliwia wybór kilku podstawowych opcji jak nazwa widoku czy opcja templatu widoku.
Jednak interesujące są te z listami rozwijalnymi. Pierwszy z nich Create a strongly-typed view umożliwia z listy rozwijalnej wybrać obiekt który będzie obowiązującym Modelem danego widoku.
Wyszukiwane są wszystkie rozpoznawalne typy równie dobrze mogą to być DataSety jak i obiekty Linq. Druga lista View content to template dla listy edycji czy dodawania.
Piszemy więc pierwszą możliwie najprostszą listę. Wykorzystuję model LinqToSql.
 public ActionResult Index()
        {
            return View(context.Risks.OrderBy(x => x.RiskID).ToList());
        }
Generuje się widok którego model wskazuje na obiekt Linq IEnumerable. Zastosowałam tutaj tylko jedną zmianę (opisaną w przykładzie) i widok jest w pełni funkcjonalny.

Dygresja dotycząca wyświetlania: niestety nie znalazłam pędzla koloryzowania kodu dla ASP więc używam HTMLa, pewnie nie wygląda to pięknie ale liczy się treść.
Dygresja druga: < %= oczywiście nie mogę połączyć < i % ponieważ wtedy zostało by to zinterpretowane jako znacznik html więc będę używać spacji, mam nadzieje że nie zaciemni to kodu.

< %= to taki sprytny znacznik który mówi to samo co Response.Write(). Ważny jest tutaj znak równości.
< % @ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage< IEnumerable< NPEduLinqDataAccess.Risk>>" %>


    Index


    

Index

<% foreach (var item in Model) { %> <% } %>
RiskID RiskCode RiskDesc RiskTypeCode RiskTypeDesc
< %= Html.ActionLink("Edit", "Edit", new { id=item.RiskID }) %> < %= Html.Encode(item.RiskID) %> < %= Html.Encode(item.RiskCode) %> < %= Html.Encode(item.RiskDesc) %> < %= Html.Encode(item.RiskType.RiskTypeCode) %> < %--RiskTypeID jedyna zmiana jaka tutaj stosuje to dodanie pol podrzednej tabelki dzieki wykorzystaniu linq poprostu pisze kropke i to co chce dalej--%> < %= Html.Encode(item.RiskType.RiskTypeDesc) %>

<%= Html.ActionLink("Create New", "Create") %>

To był obiekt Linq a teraz weźmy sobie DataSet
  public ActionResult IndexFromSntFramework(int? id)
        {
            int pageSize = 10;
            NPEduServerObjects.Risk.RiskSearch riskSearch = new NPEduServerObjects.Risk.RiskSearch();

            riskSearch.GetRiskList((id.HasValue ? id.Value : 1), (pageSize * (id.HasValue ? id.Value : 0)));
            //wypełnianie tabelki search - odpowiadającej liście

            return View(riskSearch.DataSet.RiskSearch);
            //przekazujemy tabelkę silnie typowanego DataSeta
        }
Generujemy widok. Tworzy się widok z wpisem
Inherits ="System.Web.Mvc.ViewPage< IEnumerable< NPEduBaseObjects.Risk.RiskSearchDS+RiskSearchRow>>"
- mapując Model widoku na wiersz naszej tabelki w DataSecie, reszta przebiega dokładnie tak samo jak powyżej. Do wyświetlania wystarcza jaknajbardziej.


To duża siła - parę klików i mamy wygenerowany jakiś widok.
No właśnie jakiś widok.
Ale jeśli nie chcemy się dużo napisać... od razu człowiek zaczyna szukać gotowych rozwiązań. Na CodePlex MvcContrib znajdujemy gotowe kontrolki w tym grida.
Metoda w C# jest niezwykle prosta, zawiera dodatkowo tylko parametr page a kontroler korzysta z biblioteki MvcContrib.Pagination.
public ActionResult IndexAutoMagicznyGrid(int? page)
        {
            return View(edul.Risks.AsPagination(page.GetValueOrDefault(1), 10));
        }
Wygenerowany widok natomiast należy trochę zmodyfikować
< %@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage< IPagination< NPEduLinqDataAccess.Risk>>" %>
< %@ Import Namespace="MvcContrib.UI.Pager"%>
< %@ Import Namespace="MvcContrib.UI.Grid"%>
< %@ Import Namespace="MvcContrib.Pagination"%>


 AutoMagiczny Grid z inicjatywy MvcContrib




    

IndexAutoMagicznyGrid

< %= Html.Grid(Model).Columns(column => { column.For(x => x.RiskID).Named("Risk ID"); column.For(x => x.RiskCode); column.For(x => x.RiskDesc); }) %>
< %= Html.Pager(Model) %>
Oto porównanie widoku standardowego grida oraz tego wygenerowanego przez Contrib. Contrib dostarcza od razu pagowanie (to ten co się nazywa AutoMagiczny :] ).
Oczywiście możemy napisać swój kod generujący ślicznego grida ;)


Pozostała jeszcze jedna nie omówiona wcześniej opcja a mianowicie: Create a partial view. Jak sama nazwa wskazuje generowana jest tylko część widoku - template używany później w innym widoku.
Przykład ogranicza się do samego pliku widoku. Najpierw wygenerujmy template dla obiektu Risk:
< %@ Control Language="C#" Inherits="System.Web.Mvc.ViewPage< IEnumerable< NPEduLinqDataAccess.Risk>>" %>
        < tr>
            < td>
                < %= Html.ActionLink("Edit", "Edit", new { id=item.RiskID }) %>
            < /td>
            < td>
                < %= Html.Encode(item.RiskID) %>
            < /td>
            < td>
                < %= Html.Encode(item.RiskCode) %>
            < /td>
            < td>
                < %= Html.Encode(item.RiskDesc) %>
            < /td>
            < td>
                < %= Html.Encode(item.RiskType.RiskTypeCode) %>
                < %--RiskTypeID--%>
            < /td>
            < td>
                < %= Html.Encode(item.RiskType.RiskTypeDesc) %>
            < /td>
        < /tr>
A teraz użyjmy templata w widoku listy
< %@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage< IEnumerable< NPEduLinqDataAccess.Risk>>" %>


 IndexPaged




    

IndexPaged

< table> < tr> < th> < th> RiskID < /th> < th> RiskCode < /th> < th> RiskDesc < /th> < th> RiskTypeCode < /th> < th> RiskTypeDesc < /th> < /tr> < % foreach (var item in Model) { %> < % Html.RenderPartial("IndexRowPart", item); %> < % } %> < /table>

< %= Html.ActionLink("Create New", "Create") %>

Komentarze

Popularne posty