2009-02-21 7 views
1

Je tente de créer un contrôle personnalisé dans ASP.NET MVC. La chose que je veux éviter est de mélanger la vue (html) et le code (C#) dans ces contrôles. Après des heures passées à googler et à faire face à ce problème, j'ai finalement pensé à créer des méthodes d'aide qui utilisent la vue ASP. Engine pensait à la classe ViewPage.Passage de ViewData à ViewPage dans ASP.NET MVC

Je peux créer une instance de la classe et même charger un modèle ascx en utilisant les méthodes LoadControl et LoadTemplate mais le problème est que lorsque je passe un objet ViewData à une instance de classe ViewPage, je ne peux pas voir le ViewData dans le ViewPage et que je reçois cette erreur:

The ViewUserControl '~/Components/Controls/EditableLabel/Views/EditableLabel.ascx' cannot find an IViewDataContainer. The ViewUserControl must be inside a ViewPage, ViewMasterPage, or another ViewUserControl.

en général, l'effet final que je veux réaliser des contrôles est chargement avec certains paramètres, ces paramètres doivent être lisibles dans le modèle (ascx).

exemple:

<% Html.EditableLabel(Writer, "memberName", "Name", "Antonio", "/identity/updateProperty", "memberName"); %> 
  1. est-il un moyen de passer le ViewData à l'instance ViewPage que je crée?
  2. Existe-t-il un moyen plus intelligent de créer des contrôles/widgets personnalisés dans ASP.NET MVC?

Merci à l'avance

Répondre

2
  1. Vous pouvez passer au VD VP du contrôleur via "retour View (...)" ou par "ViewData [nom] = valeur".
  2. Il est préférable d'utiliser les contrôles ascx hérités de ViewUserControl afin de créer un contrôle personnalisé. De cette façon, vous pouvez facilement transmettre des données à ce:

    <% Html.RenderPartial("FooControl", new FooViewData(){ Name="aa", Type="awesome", Id = 2}); %> 
    <% Html.RenderPartial("FooControl", new FooViewData(){ Name="aa", Type="awesome", Id = 2}, ViewData); %> 
    

Et tous les paramètres nécessaires, vous pouvez définir dans votre classe FooViewData.

Si vous voulez vraiment écrire une extension à HtmlHelper qui chargera des contrôles ascx, vous devriez regarder une classe Repeater dans MvcFutures (les sources de MVC sont here). Mais je suis sûr que dans un cas commun, vous n'en aurez pas besoin.

+1

Si vous utilisez une protection, la probabilité de passer VD est grandement réduite –

+0

Que voulez-vous dire par «protection» et pourquoi est-il diminué? Les contrôles peuvent utiliser des liaisons de valeurs pour pouvoir charger des valeurs à partir de ViewDataDictionary ou de model. – zihotki

+0

@Rexm lol! @zihotki profiter de la brise. –

2

Je suis suivi avec zihotki sur celui-ci. AveC# 2, je vais ajouter une mise en garde, cependant. Dans l'implémentation par défaut, qui utilise ASPX et ASCX comme vues, la création de contrôles MVC (utilisez le modèle pour vous assurer que votre chien est stérilisé) est la meilleure option.

Maintenant pour la mise en garde. ASPX et ASCX ne doivent pas être les vues. Si vous regardez le blog de Phil Haack, vous verrez d'autres moteurs de vue mentionnés, comme le Spark View Engine (ASP.NET MVC Northwind Demo Using the Spark View Engine). En fait, Phil a mis en place un exemple d'utilisation de moteurs de vue alternatifs dans cette entrée: Rendering A Single View Using Multiple ViewEngines.

Je ne suggère pas que vous passiez à d'autres moteurs de vue, mais seulement qu'il existe une option, si vous en trouvez une qui correspond mieux à votre domaine de problème. Parfois, il est préférable de s'en tenir à la mise en œuvre hors de la boîte. Dans ce cas, gardez les choses simples avec les contrôles ASCX. En passant, si vous êtes sérieusement dans MVC comme histoire de votre interface utilisateur, you should look at the codeplex projects for MVC. Le plus important ici est probablement MVC.Contrib, mais il y a quelques autres gemmes dans la liste.

Questions connexes