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.
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