Domanda

In una pagina con impalcature in Dati dinamici ASP.NET, se l'entità ha un campo chiave esterna e il valore richiesto non si trova nella tabella delle chiavi primarie, ovvero non è nell'elenco a discesa, è necessario abbandonare le tue modifiche all'entità, aggiungi il valore della chiave esterna ricercata alla sua tabella e ritorna all'entità originale.

Come posso fare per aggiungere un collegamento / pulsante "Nuovo" al modello di campo chiave esterna, che aprirebbe una nuova finestra (rendere visibile un pannello) in cui è possibile aggiungere il valore desiderato e quindi aggiornare il menu a discesa ?

È stato utile?

Soluzione

Intendi come nel django admin ui;). Attualmente sto cercando di implementare quella funzione, pubblicherò qui il codice se riesco a farlo funzionare.

EDIT:

Ok, ho capito che funziona, completa lo stile django ... È un po 'lungo da spiegare ma in realtà semplice.

File da creare:

Un admin_popup.master per avere una bella pagina pop-up (copia admin.master senza l'intestazione).

Un popup_Insert.aspx con admin_popup.master come master. (copia il file Insert.aspx)

modifiche

Al tuo admin.master.cs: aggiungi questo:

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);
}

Nel tuo admin_popup.master, aggiungi questi attributi al tag body (è usato per ridimensionare il poup)

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

Nel tuo 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);        
}

In popup_Insert.aspx.cs, sostituire queste due funzioni:

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); 
    }
}

In ForeignKey_Edit.ascx, aggiungi un LinkButton (ID = LinkButton1) e in ForeignKey_Edit.ascx.cs, sostituisci quella funzione

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;
    }
}

E infine le due funzioni di estensione che uso (mettilo dove vuoi):

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));
    }
}

Nel tuo global.asax, registra il nuovo percorso cambiando quella linea:

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

Ok, spero di non aver dimenticato nulla ... Certamente potrebbe essere migliorato, ma funziona. Ok, spero che alcune persone diventino molto utili, rende ASP.NET Dynamic Data molto meglio;). Adesso vado a dare un'occhiata alle relazioni molte-a-molte.

Altri suggerimenti

ATTN: UTENTI VB.net

Se sei stato come me e hai fumato in bocca per quanto i dati dinamici siano contorti e disordinati, questo è per TE! Mi ci sono volute più di 100 ore solo per capire le basi di DD (anche se sono molto esperto in altre tecniche di programmazione di database).

La soluzione di Guillaume è molto più semplice di quella di Naughton per noi. Dopo oltre 15 ore di tentativi di traduzione di Naughton, ho cercato di tradurre il codice di Guillaume che mi ha richiesto solo 2 ore per arrivare al lavoro. Eccolo nello stesso ordine. (Nota: le estensioni cs si traducono ovviamente in estensioni vb)

  1. Ignora le indicazioni di admin.master.cs.

  2. Esegui il codice admin_popup.master. Se sei ancora in VS 2008 o precedenti, riceverai un errore CSS nel preventivo di blocco inline. Ignora l'errore.

  3. Sottotitolo MASTER FILE OnInit:

    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. Sostituisci gli eventi in (popup_Insert.aspx.vb) sotto le tue pagine personalizzate con questo:

    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 Sottotitoli protetti DetailsView1_ItemInserted (mittente ByVal come oggetto, ByVal e As DetailsViewInsertedEventArgs)     Se e.Exception non è niente OrElse e.ExceptionHandled Then         System.Web.UI.ScriptManager.RegisterClientScriptBlock (Me, Me.GetType, " Close_Window " ;, " window.opener.location.reload (true); self.close (); " ;, True)     Finisci se End Sub

  5. Crea un FieldTemplate personalizzato da ForeignKey_Edit e chiamalo ForeignLinkKey_Edit.ascx. Dopo il controllo dropdownlist1, aggiungi due spazi (& nbsp;) e quindi crea asp: LinkButton come ha affermato. Inserisci testo come " Aggiungi __ " o qualcosa di simile. Sostituisci la funzione Caricamento pagina con questa:

    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 (' " & amp; ForeignKeyColumn.ParentTable.GetActionPath (" Insert "). Sostituisci (" Insert.aspx " ;, " popup_Insert.aspx ") & amp; _ " ',' " & Amp; & Quot; fk_popup_ " & Amp; ForeignKeyColumn.ParentTable.Name & amp; " ', config =' " & Amp; _ & Quot; height = 400, width = 400, toolbar = no, menubar = no, le barre di scorrimento = no, ridimensionabile = no, location = no, le directory = no, status = no " & Amp; " '); return false; "     Finisci se     Se richiesta (" __ eventargument ") = " aggiorna " Poi         DropDownList1.Items.Clear ()         If Not Column.IsRequired Quindi             DropDownList1.Items.Add (New ListItem (" [Not Set] " ;, " "))         Finisci se         PopulateListControl (DropDownList1)         DropDownList1.SelectedIndex = DropDownList1.Items.Count - 1     Finisci se End Sub

  6. Ignora le funzioni delle estensioni.

  7. Suggerisce l'instradamento aggiornato. Nota: se stai utilizzando percorsi personalizzati, dovrai armeggiare fino a quando il routing non sarà corretto.

Oppure ho appena creato due controlli server e un post sul blog qui: Un controllo Inserisci popup per dati dinamici che fa praticamente lo stesso, ma incapsula la funzionalità popup nei controlli del server passando un valore bak dalle finestre popup alle finestre principali e al pulsante popup.

Qualche nuova funzionalità in Dynamic Data in VS2010 RC? Dovremo ancora ricorrere ad hack come questi per semplici dettagli anagrafici in dati dinamici nell'ambito di questo RC?

In attesa di alcuni post sul blog DD in VS2010 RC ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top