4 Stimmen

Sollte eine ASP.NET-Masterseite ihre Daten aus der Ansicht beziehen?

Ich habe mit ASP.NET MVC mit einer Website, die eine Master-Seite enthält, herumgespielt.

Ich habe ein MVC-Benutzersteuerelement namens ProductThumbnailControl . Die Benutzersteuerung zeigt ein Produkt und ein kleines Vorschaubild an. Die Ansicht ist eine ViewProduct Ansicht, in der alle Produktinformationen angezeigt werden - das Benutzerkontrollfeld ist nur ein UI-Element außerhalb der Website.

 public partial class ProductThumbnailControl :
                      System.Web.Mvc.ViewProductControl<ViewProductsModel>
 {

 }

Ich habe einen Blogeintrag gelesen die zeigt, wie die Benutzerkontrollen verbraucht werden ViewData . Ich habe gelernt, dass die Benutzerkontrolle automagisch erhält sein Modell von der übergeordneten Ansicht. Da die Ansicht dieselben Daten verwendet, muss sie nichts explizit an das Benutzersteuerelement weitergeben, was zu einem saubereren Markup und Code führt.

Jetzt habe ich erfahren, dass die Masterseite dieselbe ViewData wie die Seite. Das bedeutet, dass die Masterseite selbst nicht wirklich ein Modell hat, um sich selbst zu rendern.

Pregunta

Wie kann eine Musterseite ihre Daten überhaupt erhalten?

Ich habe mir überlegt, Folgendes zu versuchen?

Sie könnten eine SiteModel :

//Arbitrary properties for example
class SiteModel 
{
    public string PartnerId {get; set;}
    public ShoppingCart ShoppingCartContents {get; set;}    
    public string CurrentUserId {get; set;}
}

Die Ansicht erbt von ihr:

class ViewProductModel : SiteModel 
{
    public Product Product {get; set;}
}

SiteModel würde von der Master-Seite verbraucht werden. Ansichten könnten bei Bedarf Daten daraus verwenden - wenn sie die E-Mail des aktuellen Benutzers irgendwo anzeigen müssten.

Ist das eine furchtbare Idee?

Sollte die Masterseite ihre Daten einfach von dort beziehen, wo sie sie benötigt?

Was ist, wenn ich ein Benutzersteuerelement in die masthead ?

Woher sollte sie ihre ViewData aus, da es nur einen einzigen ViewData Objekt für die gesamte Seite?

Müsste ich diese schreckliche Syntax verwenden, die ich hasse, und der Benutzerkontrolle der Masterseite ein explizites Modell übergeben?

Html.RenderUserControl("~/Views/Account/UserControls/Header.ascx",
  null, new { SelectedItem = "Profile" })

Wie geht man am besten mit diesem Szenario um?

3voto

Odd Punkte 4697

Unsere Masterseite übernimmt Daten aus der Ansicht. Wir verwenden stark typisierte Ansichtsnamen für unsere Views und in den Methoden für diese Implementierung fügen wir auch Standard-View-Daten hinzu, die jede Seite von unseren persistenten Objekten benötigt (wie die Informationen zur Struktur des Anwendungsmenüs, die Benutzerinformationen, die auf dem Bildschirm angezeigt werden sollen, usw.).

Dies hat zwar den Nachteil, dass unsere Ansichtsdaten für die Masterseite nicht so stark typisiert sind wie für das Model-Objekt, aber für uns funktioniert es sehr gut.

Ihre Idee ist auch gut. Da die Idee der Masterseite der Idee der Vererbung ähnlich ist, warum nicht die Vererbung für die Einrichtung Ihrer Modellobjekte verwenden. Sie könnten noch einen Schritt weiter gehen und eine Modellfabrik erstellen, die Ihre Modellobjekte erzeugt und dabei die Daten der Basisklasse festlegt.

2voto

Simon_Weaver Punkte 129442

Wie es aussieht, ist meine Lösung der Empfehlung von Microsoft sehr ähnlich, mit einer wichtigen Ausnahme. Ich war creatng eine ViewData-Basisklasse, und sie erstellen eine Controller-Basisklasse - die viel mehr Sinn macht.

Es scheint jedoch, dass beide Ideen zusammen funktionieren könnten (und sollten). Das MS-Tutorial unten verwendet ein Wörterbuch, um Ansichtsdaten zu speichern. Wenn Sie also ein stark typisiertes Modell hätten, würden Sie auch eine Basisklasse dafür benötigen.

Microsoft MVC-Tutorial

0voto

Matthew Punkte 2105

Ich würde einen ShoppingCart-Controller (oder separate Controller für jedes Anliegen) erstellen und Benutzersteuerelemente, die sie mit RenderAction in der Futures-DLL, die Sie von www.codeplex.com/asp.net herunterladen können, verwenden. Es ist Teil des ASP.NET MVC-Quellcodes.

Die Verwendung eines Basis-Controllers oder eines "Site-Modells" koppelt zu viele Dinge miteinander, was zu einem Alptraum bei Tests und Wartung führt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X