2010-04-05 3 views
0

J'ai une application ASP.NET Web Forms et j'utilise des contrôles dynamiques dans la vue qui dépendent de ce que le présentateur expose. Est-il acceptable que la vue dans ce cas tire sur le présentateur pour ces données? Y at-il quelque chose que je devrais être très prudent au sujet de la possibilité de testabilité et une conception faiblement couplée.Comment la vue doit-elle tirer sur le Presenter dans le modèle MVP?

La page dans ce cas a son propre cycle de vie de page et le présentateur ne sait pas à ce sujet. Cependant, le cycle de vie de la page dicte que quelque chose doit se produire à des moments précis du cycle de vie de la page. Cela sent comme des ennuis ... Toute fosse connue tombe?

EDIT

Lorsque mon point de vue concret frappe l'événement Init il va tirer sur le présentateur pour une collection qui se traduira par un tas de contrôles serveur ASP.NET à créer. Je me demande si c'est une mauvaise chose à faire ... Le présentateur ne sait pas comment répondre à l'événement init du cycle de vie de la page, mais il doit le faire si la vue doit être remplie de contrôles dynamiques.

+0

Je ne comprends toujours pas pourquoi le présentateur doit être conscient du cycle de vie de la page. Le présentateur ne donne-t-il pas juste une collection à la vue? Les contrôles du serveur ne sont-ils pas créés et rendus dans la vue? – BlackICE

Répondre

1

Ceci est une question vexante - lorsque vous voulez des contrôles dynamiques dans les formulaires Web ASP.NET, vous devez choisir le moindre de deux maux. En fin de compte, cela revient à quel compromis vous voulez faire: les préoccupations du présentateur dans la vue ou voir les préoccupations dans le présentateur.

Quand je travaille dans les formulaires Web que je préfère habituellement ce dernier - J'accepte que le présentateur est lié au cycle de vie de page ASP.NET et créer une méthode InitializeView à faire tout ce qui est nécessaire pour créer des contrôles dynamiques:

// Presenter 
// This could also be parameterless if you prefer that idiom but 
// then the view needs a SelectedState property that serves up values 
// straight from the Form collection, and it won't be obvious why. 
public void InitializeView(string selectedState) { 
    if (selectedState != null) { 
     view.Counties = dataLayer.GetCounties(selectedState); 
    } 
} 

// View 
protected void Page_Init(object sender, EventArgs args) { 
    presenter.InitializeView(Request.Form["StateList"]); 
    // ... build counties drop-down ... 
} 

Bien sûr, cela lie la sémantique du présentateur au cycle de vie ASP.NET et obscurcit ce qui se passe dans cette méthode. Vous pouvez atténuer cela en donnant InitializeView un nom plus descriptif, comme ProcessSelectedState, mais à moins que le nom de la méthode ne fasse référence au cycle de vie de la page, il ne sera jamais évident pourquoi vous n'obtiendrez pas seulement des comtés avec le reste du modèle (presenter.LoadModel ou vous pourriez l'appeler).

Je peux voir comment l'alternative est intéressante:

protected void Page_Init(object sender, EventArgs args) { 
    if (Request.Form["StateList"] != null) { 
     List<string> counties = presenter.GetCounties(Request.Form["StateList"]); 
     // ... build counties drop-down ... 
    } 
} 

La sémantique du Presenter sont parfaitement claires - il est facile de comprendre ce que GetCounties fait et il n'a rien à voir avec le cycle de vie de la page. Mais vous avez des choses testables à votre avis, ce qui est un peu décevant, et c'est généralement plus important pour moi que de garder mes présentateurs ignorants de leur moteur de vue.

Une autre alternative consiste à simplement charger votre modèle entier pendant l'initialisation de la page. Les valeurs de contrôle de votre serveur ne seront pas disponibles, vous devrez donc en obtenir une de Request.Form. Ce n'est pas classique ASP.NET classique - il pourrait être indûment déroutant puisque la plupart des développeurs de formulaires Web sont habitués à obtenir des valeurs directement à partir des contrôles Web au lieu de directement à partir des données POST.

+0

Merci pour une réponse très perspicace, au pire je ne peux pas vous donner plusieurs pouces en l'air.Il me semble que ce n'est pas juste ou faux, ça va se résumer à ce qui est testable et ceux qui sont importants pour avoir des propriétés. –

0

IMO le présentateur est l'endroit où la vue est censée obtenir ses données de/bind à/etc. Le présentateur est la pièce qui ferait l'objet d'un test unitaire. De votre deuxième déclaration, il semble que vous ayez besoin de plusieurs présentateurs pour cette page, mais j'aurais besoin de plus de détails pour être sûr.

Questions connexes