Nouveau bouton pour les champs de clé étrangère dans les données dynamiques

StackOverflow https://stackoverflow.com/questions/1622330

  •  06-07-2019
  •  | 
  •  

Question

Dans une page échafaudée dans ASP.NET Dynamic Data, si l'entité a un champ de clé étrangère et que la valeur recherchée ne figure pas dans la table de clé primaire, c'est-à-dire qu'elle ne figure pas dans la liste déroulante, vous devez abandonner. vos modifications apportées à l'entité, ajoutez la valeur de la clé étrangère recherchée à sa table et revenez à votre entité d'origine.

Comment puis-je ajouter un lien / bouton "Nouveau" au modèle de champ de clé étrangère, qui ouvrirait une nouvelle fenêtre (rendre un panneau visible) où vous pouvez ajouter la valeur recherchée, puis actualiser le menu déroulant ?

Était-ce utile?

La solution

Vous voulez dire comme dans l'administration de Django;). J'essaie actuellement d'implémenter cette fonctionnalité, je posterai le code ici si je l'obtiens.

EDIT:

Ok, ça doit marcher, style django complet ... C'est un peu long à expliquer mais simple en fait.

Fichiers à créer:

Un admin_popup.master pour avoir une belle page popup (copier le admin.master sans l'en-tête).

Un popup_Insert.aspx avec admin_popup.master en tant que maître. (copiez le fichier Insert.aspx)

Modifications

À votre admin.master.cs: ajoutez ceci:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);

    System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "refresh_fks", @"
    var fk_dropdown_id;
    function refresh() {
        __doPostBack(fk_dropdown_id,'refresh');
    };", true);
}

Dans votre admin_popup.master, ajoutez ces attributs à la balise body (utilisée pour redimensionner le groupe)

<body style="display: inline-block;" onload="javascript:resizeWindow();">

Dans votre admin_popup.master.cs

protected override void  OnInit(EventArgs e)
{
    base.OnInit(e);

    System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "refresh_fks", @"
    var fk_dropdown_id;
    function refresh() {
        __doPostBack(fk_dropdown_id,'refresh');
    };", true);

    System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "resize_window", @"function resizeWindow() {
        window.resizeTo(document.body.clientWidth + 20, document.body.clientHeight + 40);
        window.innerHeight = document.body.clientHeight + 5;
        window.innerWidth = document.body.clientWidth;
    }", true);

    System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "update_parent", @"function updateParent() {
        window.opener.refresh();
    }", true);        
}

Dans popup_Insert.aspx.cs, remplacez ces deux fonctions:

protected void DetailsView1_ItemCommand(object sender, DetailsViewCommandEventArgs e) {
    if (e.CommandName == DataControlCommands.CancelCommandName)
        System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Close_Window", "self.close();", true); 
}

protected void DetailsView1_ItemInserted(object sender, DetailsViewInsertedEventArgs e) {
    if (e.Exception == null || e.ExceptionHandled) {
        System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Close_Window", "window.opener.refresh(); self.close();", true); 
    }
}

Dans ForeignKey_Edit.ascx, ajoutez un LinkButton (ID = LinkButton1) et dans ForeignKey_Edit.ascx.cs, remplacez cette fonction

protected void Page_Load(object sender, EventArgs e) {
    if (DropDownList1.Items.Count == 0)
    {
        if (!Column.IsRequired) {
            DropDownList1.Items.Add(new ListItem("[Not Set]", ""));
        }

        PopulateListControl(DropDownList1);
        LinkButton1.OnClientClick = @"javascript:fk_dropdown_id = '{0}';window.open('{1}', '{2}', config='{3}');return false;".FormatWith(
            DropDownList1.ClientID,
            ForeignKeyColumn.ParentTable.GetPopupActionPath(PageAction.Insert),
            "fk_popup_" + ForeignKeyColumn.ParentTable.Name, "height=400,width=600,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,directories=no,status=no");
    }
    if (Request["__eventargument"] == "refresh")
    {
        DropDownList1.Items.Clear();
        if (!Column.IsRequired)
        {
            DropDownList1.Items.Add(new ListItem("[Not Set]", ""));
        }

        PopulateListControl(DropDownList1);
        DropDownList1.SelectedIndex = DropDownList1.Items.Count - 1;
    }
}

Et enfin les deux fonctions d'extension que j'utilise (mettez-la où vous voulez):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Web.DynamicData;
using System.Web.UI;

public static class Utils
{
    [DebuggerStepThrough]
    public static string FormatWith(this string s, params object[] args)
    {
        return string.Format(s, args);
    }

    public static string GetPopupActionPath(this MetaTable mt, string action)
    {
        return new Control().ResolveUrl("~/{0}/popup_{1}.aspx".FormatWith(mt.Name, action));
    }
}

Dans votre fichier global.asax, enregistrez le nouvel itinéraire en modifiant cette ligne:

Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert|popup_Insert" }),

Ok, j'espère que je n'ai rien oublié ... Cela pourrait certainement être amélioré, mais cela fonctionne. Ok, j'espère que certaines personnes trouveront cela utile, cela rend ASP.NET Dynamic Data encore plus performant;). Je vais maintenant jeter un œil sur les relations plusieurs à plusieurs.

Autres conseils

ATTN: UTILISATEURS VB.net

Si vous avez été comme moi et que vous vous moquez de la bouche à propos de la complexité et de la confusion qui caractérisent Dynamic Data, c’est pour vous! Il m'a fallu plus de 100 heures pour comprendre les bases de la DD (même si je connais très bien les techniques de programmation de bases de données).

La solution de Guillaume est beaucoup plus simple que celle de Naughton pour nous. Après plus de 15 heures d’essai de traduction de Naughton, j’ai essayé de traduire le code de Guillaume, ce qui ne m'a pris que 2 heures pour me rendre au travail. Ici c'est dans le même ordre. (Remarque: les extensions cs sont bien sûr traduites en extensions vb)

  1. Ignorez les instructions admin.master.cs.

  2. Faites le code admin_popup.master. Si vous êtes toujours dans VS 2008 ou une version antérieure, vous obtiendrez une erreur CSS sur le devis en bloc. Ignorer l'erreur.

  3. FICHIER PRINCIPAL OnInit Sub:

    Protected Overrides Sub OnInit(ByVal e As EventArgs)
    MyBase.OnInit(e)
    System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, Page.GetType, "refresh_fks", "     var fk_dropdown_id;     function refresh() {         __doPostBack(fk_dropdown_id,'refresh');     };", True)
    System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, Page.GetType, "resize_window", "function resizeWindow() {         window.resizeTo(document.body.clientWidth + 120, document.body.clientHeight + 120);         window.innerHeight = document.body.clientHeight + 5;         window.innerWidth = document.body.clientWidth;     }", True)
    System.Web.UI.ScriptManager.RegisterClientScriptBlock(Page, Page.GetType, "update_parent", "function updateParent() {        window.opener.location.reload(true);     }", True)
    

    End Sub

  4. Remplacez les événements de (popup_Insert.aspx.vb) sous vos pages personnalisées par ceci:

    Protected Sub DetailsView1_ItemCommand(ByVal sender As Object, ByVal e As DetailsViewCommandEventArgs)
    If e.CommandName = DataControlCommands.CancelCommandName Then
        System.Web.UI.ScriptManager.RegisterClientScriptBlock(Me, Me.GetType, "Close_Window", "self.close();", True)
    End If
    

    End Sub Protected Sub DetailsView1_ItemInserted (expéditeur de ByVal en tant qu'objet, ByVal et en tant que DetailsViewInsertedEventArgs)     Si e.Exception n'est rien ouElse e.ExceptionHandled alors         System.Web.UI.ScriptManager.RegisterClientScriptBlock (Me, Me.GetType, "Close_Window", "window.opener.location.reload (true); self.close ();", true)     Fin si End Sub

  5. Créez un FieldTemplate personnalisé à partir de ForeignKey_Edit et nommez-le ForeignLinkKey_Edit.ascx. Après le contrôle dropdownlist1, ajoutez deux espaces (& nbsp;), puis créez l'asp: LinkButton comme il l'a indiqué. Placez un texte du type "Ajouter __". ou quelque chose comme ça. Remplacez la fonction de chargement de page par ceci:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If DropDownList1.Items.Count = 0 Then
        If Not Column.IsRequired Then
            DropDownList1.Items.Add(New ListItem("[Not Set]", ""))
        End If
        PopulateListControl(DropDownList1)
    
        LinkButton1.OnClientClick = "javascript:fk_dropdown_id = '" & DropDownList1.ClientID & _
    

    "window.open (" & ForeignKeyColumn.ParentTable.GetActionPath ("Insert"). Replace ("Insert.aspx", "popup_Insert.aspx ")" & amp; _ " ',' " & amp; " fk_popup_ " & amp; ForeignKeyColumn.ParentTable.Name & amp; ", config = '" & amp; _ "hauteur = 400, largeur = 400, barre d'outils = non, barre de menu = non, barres de défilement = non, redimensionnable = non, emplacement = non, répertoires = non, statut = non" & amp; " '); return false; "     Fin si     Si demande (" __ eventargument ")) = " refresh " ensuite         DropDownList1.Items.Clear ()         Si pas Column.IsRequired Then             DropDownList1.Items.Add (New ListItem ("[Non défini]", "" ")))         Fin si         PopulateListControl (DropDownList1)         DropDownList1.SelectedIndex = DropDownList1.Items.Count - 1     Fin si End Sub

  6. Ignorer les fonctions des extensions.

  7. Faites le routage mis à jour suggéré. Remarque: si vous utilisez des itinéraires personnalisés, vous devrez les modifier jusqu'à ce que le routage soit correct.

Ou je viens de créer deux commandes de serveur et un article de blog ici: Un contrôle d'insertion contextuelle pour les données dynamiques cela fait à peu près la même chose, mais encapsule la fonction popup dans les contrôles serveur en passant une valeur bak des fenêtres popup vers la fenêtre principale et le bouton popup.

Des nouvelles fonctionnalités dans Dynamic Data dans le VS2010 RC? Faudra-t-il quand même recourir à de tels piratages pour de simples détails maîtres dans Dynamic Data sous ce RC?

Nous attendons avec intérêt certains articles de blog sur DD sous VS2010 RC ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top