Jaki jest Twój sposób przekazywania danych do strony wzorcowej (przy użyciu ASP.NET MVC) bez łamania reguł MVC?
Osobiście wolę kodować abstrakcyjny kontroler (kontroler bazowy) lub klasę bazową, która jest przekazywana do wszystkich widoków.
Jaki jest Twój sposób przekazywania danych do strony wzorcowej (przy użyciu ASP.NET MVC) bez łamania reguł MVC?
Osobiście wolę kodować abstrakcyjny kontroler (kontroler bazowy) lub klasę bazową, która jest przekazywana do wszystkich widoków.
Odpowiedzi:
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 niezła równowaga między designem a praktycznością IMHO.
Strona wzorcowa przyjmuje silnie wpisaną klasę danych widoku zawierającą tylko istotne dla niej informacje:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Każdy widok korzystający z tej strony wzorcowej przyjmuje silnie wpisaną klasę danych widoku zawierającą informacje i pochodzącą z danych widoku stron wzorcowych:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Ponieważ nie chcę, aby poszczególni kontrolerzy wiedzieli cokolwiek o łączeniu danych ze 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 dopasowuje wzorzec, aby dobrze wyświetlać relację, ale jeśli chodzi o renderowanie części / elementów sterujących użytkownika, skomponuję ich dane widoku do danych widoku stron, 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); %>
To jest tylko przykładowy kod i nie jest przeznaczony do kompilacji w obecnej postaci. Zaprojektowany dla ASP.Net MVC 1.0.
Wolę rozbijać elementy widoku głównego oparte na danych na części i renderować je za pomocą Html.RenderAction . Ma to kilka wyraźnych zalet w porównaniu z popularnym podejściem do dziedziczenia modelu widoku:
EDYTOWAĆ
Poniżej znajdziesz lepszą odpowiedź na to pytanie ogólne . Proszę przeczytaj to!
Oryginalna odpowiedź
Microsoft faktycznie opublikował wpis dotyczący „oficjalnego” sposobu radzenia sobie z tym problemem. Jest to przewodnik krok po kroku z wyjaśnieniem ich uzasadnienia.
Krótko mówiąc, zalecają użycie abstrakcyjnej klasy kontrolera, ale przekonaj się sam.
Zrobiłem trochę badań i trafiłem na te dwie strony. Może mogliby pomóc.
ASP.NET MVC Tip # 31 - Przekazywanie danych do stron wzorcowych i formantów użytkownika
Przekazywanie danych do stron wzorcowych za pomocą ASP.NET MVC
Uważam, że wspólny rodzic dla wszystkich obiektów modelu, które przekazujesz do widoku, jest wyjątkowo przydatny.
I tak zawsze będą istnieć pewne typowe właściwości modelu między stronami.
Obiekt Request.Params jest zmienny. Dość łatwo jest dodać do niego wartości skalarne w ramach cyklu przetwarzania żądania. Z perspektywy widoku te informacje mogły zostać podane w QueryString lub FORM POST. hth
Myślę, że innym dobrym sposobem mogłoby być utworzenie interfejsu do widoku z pewną właściwością, taką jak ParentView jakiegoś interfejsu, dzięki czemu można go używać zarówno do kontrolek, które wymagają odniesienia do strony (kontrola nadrzędna), jak i do widoków głównych, do których należy uzyskać dostęp z wyświetlenia.
Innym rozwiązaniom brakuje elegancji i trwają zbyt długo. Przepraszam za zrobienie tej bardzo smutnej i zubożałej rzeczy 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 wyraźnie mam tę statyczną metodę Get () w SiteMasterViewData, która zwraca SiteMasterViewData.