Przekazywanie danych do strony wzorcowej w ASP.NET MVC

Jaki jest Twój sposób przekazywania danych do strony wzorcowej (za pomocą ASP.NET MVC) bez łamania zasad MVC?

Osobiście wolę kodować abstrakcyjny kontroler (base controller) lub klasę bazową, która jest przekazywana do wszystkich widoków.

Author: Łukasz Sowa, 2008-09-17

9 answers

Jeśli wolisz, aby Twoje widoki miały silnie wpisane klasy danych widoku, może to zadziałać. Inne rozwiązania są prawdopodobnie bardziej poprawne , ale jest to miła równowaga między designem a praktycznością IMHO.

Strona wzorcowa przyjmuje silnie wpisaną klasę danych widoku zawierającą tylko informacje istotne dla niej:

public class MasterViewData
{
    public ICollection<string> Navigation { get; set; }
}

Każdy widok korzystający z tej strony wzorcowej pobiera silnie wpisaną klasę danych widoku zawierającą jej informacje i pochodzącą z widoku stron wzorcowych data:

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

Ponieważ nie chcę, aby poszczególne Kontrolery wiedziały cokolwiek o łączeniu danych stron wzorcowych, umieszczam tę logikę w fabryce, która jest przekazywana do każdego kontrolera:

public interface IViewDataFactory
{
    T Create<T>()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create<ProductViewData>();

        viewData.Name = "My product";
        viewData.Price = 9.95;

        return View("Index", viewData);
    }
}

Dziedziczenie pasuje do wzorca, aby wyświetlić relację dobrze, ale jeśli chodzi o renderowanie częściowych / kontrolek użytkownika, skomponuję ich dane widoku do stron view data, np.

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
    public SubViewData SubViewData { get; set; }
}

<% Html.RenderPartial("Sub", Model.SubViewData); %>

jest to tylko przykładowy kod i nie jest przeznaczony do kompilacji tak jak jest. Przeznaczony do ASP.Net MVC 1.0.

 76
Author: Generic Error,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-14 01:33:07

Wolę dzielenie sterowanych danymi fragmentów widoku głównego Na części i renderowanie ich za pomocą Html.RenderAction . Ma to kilka wyraźnych zalet w stosunku do popularnego podejścia do dziedziczenia modelu widoku:

  1. Dane widoku głównego są całkowicie oddzielone od" zwykłych " modeli widoku. Jest to kompozycja nad dziedziczeniem i skutkuje bardziej luźno sprzężonym systemem, który jest łatwiejszy do zmiany.
  2. Modele Master view są budowane przez całkowicie oddzielny kontroler akcja. "Regularne" działania nie muszą się tym martwić i nie ma potrzeby tworzenia fabryki danych widoku, która wydaje się zbyt skomplikowana jak na mój gust.
  3. jeśli zdarzy ci się użyć narzędzia takiego jak AutoMapper do mapowania domeny do modeli widoku, łatwiej będzie Ci skonfigurować, ponieważ modele widoku będą bardziej przypominały modele domeny, gdy nie odziedziczą danych widoku głównego.
  4. z oddzielnymi metodami akcji dla danych podstawowych, można łatwo zastosować buforowanie wyjściowe do niektóre regiony strony. Zazwyczaj widoki główne zawierają dane, które zmieniają się rzadziej niż zawartość strony głównej.
 59
Author: Todd Menier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 21:48:08

EDIT

Generic Error dostarczył lepszą odpowiedź poniżej. Proszę przeczytaj!

Oryginalna Odpowiedź

Microsoft rzeczywiście opublikował wpis na " oficjalny " sposób, aby poradzić sobie z tym. Zapewnia to krok po kroku przejście z wyjaśnieniem ich rozumowania.

W skrócie, zalecają użycie abstrakcyjnej klasy kontrolera, ale przekonajcie się sami.

 20
Author: Michael La Voie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:38

Abstrakcyjne Kontrolery to dobry pomysł i nie znalazłem lepszego sposobu. Ciekawi mnie, co zrobili inni.

 7
Author: Ian P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:12:41
 3
Author: David Negron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-12 12:07:49

Uważam, że wspólny rodzic dla wszystkich obiektów modelu przekazywanych do widoku jest wyjątkowo przydatny.

Między stronami zawsze będą występować wspólne właściwości modelu.

 2
Author: Matt Mitchell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:27:34

Prośba.Obiekt Params jest zmienny. Bardzo łatwo jest dodać do niego wartości skalarne w ramach cyklu przetwarzania żądań. Z tego punktu widzenia, informacje te mogły być podane w zapytaniu lub formularzu POST. hth

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:12:56

Myślę, że Innym dobrym sposobem może być stworzenie interfejsu dla widoku z jakąś właściwością jak ParentView jakiegoś interfejsu, więc można go używać zarówno dla kontrolek, które wymagają odniesienia do strony (Kontrola rodzicielska) i dla widoków głównych, które powinny być dostępne z widoków.

 0
Author: dimarzionist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:19:25

Inne rozwiązania nie mają elegancji i trwają zbyt długo. Przepraszam za zrobienie tego bardzo smutnego i zubożałego prawie cały rok później:

<script runat="server" type="text/C#">
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        MasterModel = SiteMasterViewData.Get(this.Context);
    }

    protected SiteMasterViewData MasterModel;
</script>

Więc najwyraźniej mam statyczną metodę Get () na SiteMasterViewData, która zwraca SiteMasterViewData.

 0
Author: rasx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-30 05:28:38