Frage

In einer eingerüstet Seite ASP.NET Dynamische Daten, wenn die Einheit, die eine foreign key-Feld ein und der Wert, den Sie suchen, nicht in der der Primärschlüssel der Tabelle, d.h.nicht in der drop-down-Menü haben Sie zum verlassen Ihre änderungen an der Entität hinzufügen, die gesucht Fremdschlüssel-Wert an seinen Tisch, und kehren Sie zu Ihrem ursprünglichen Einheit.

Wie könnte ich mich über das hinzufügen einer "Neuen" link/button zu dem Fremdschlüssel-Feld-Vorlage, das würde ein neues Fenster öffnen (machen Sie einen Bereich sichtbar), wo Sie fügen Sie die gesuchten Wert ein, und aktualisieren Sie dann die Dropdown -?

War es hilfreich?

Lösung

Du meinst, wie in der django Admin ui;). Ich bin zur Zeit versucht, diese Funktion zu implementieren, ich werde den Code hier posten, wenn ich es an der Arbeit.

EDIT:

Ok, habe ich das Werk, komplett django Stil ... Es ist ein bisschen lang zu erklären, aber einfach in der Tat.

Dateien zu erstellen:

A admin_popup.master eine schöne Popup-Seite haben (kopieren Sie die admin.master ohne Header).

Ein popup_Insert.aspx mit admin_popup.master als Master. (Kopieren Sie die Insert.aspx)

Änderungen

Um Ihre admin.master.cs: fügen Sie diese:

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

In Ihrem admin_popup.master, fügen Sie diese Attribute auf den Body-Tag (es wird benutzt, um die poup, um die Größe)

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

In Ihrem 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, ersetzen diese beiden Funktionen:

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, fügen Sie ein Linkbutton (ID = LinkButton1) und in ForeignKey_Edit.ascx.cs, ersetzen Sie diese Funktion

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

Und schließlich die beiden extentions Funktionen, die ich verwenden (Put es, wo Sie wollen):

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

In Ihrer global.asax, registrieren die neue Route durch diese Zeile zu ändern:

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

Ok, ich hoffe, ich habe nichts vergessen ... Es sicherlich verbessert werden könnte, aber es funktioniert. Ok Ich hoffe, einige Leute, die nützlich fint wird, es ASP.NET Dynamic Data macht viel mehr besser;). Ich goind nun einen Blick auf vielen-zu-viele-Beziehungen zu nehmen.

Andere Tipps

ATTN: VB.net NUTZER

Wenn Sie wie ich gewesen und rauchend an der Mündung darüber, wie verworren und ein Chaos Dynamic Data ist, ist dies für Sie! Es hat mich mehr als 100 Stunden in Anspruch genommen nur die Grundlagen der DD, um herauszufinden, (obwohl ich bin sehr in anderer Datenbank-Programmierung techiniques versiert).

Guillaume-Lösung ist viel einfacher als Naughton ist für uns. Nach mehr als 15 Stunden zu versuchen, Naughton die ich versuchte zu übersetzen Guillaumes Code, der mir dauerte nur 2 Stunden arbeiten zu übersetzen. Hier ist es in der gleichen Reihenfolge. (Anmerkung: cs Erweiterungen natürlich übersetzen Erweiterungen vb)

  1. Ignorieren Sie die admin.master.cs Richtungen.

  2. Haben die admin_popup.master Code. Wenn Sie noch in VS 2008 oder älter sind werden Sie einen CSS-Fehler auf dem Inline-Block-Angebot erhalten. Ignorieren Sie den Fehler.

  3. Stammdatei 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. Ersetzen Sie die Ereignisse in (popup_Insert.aspx.vb) unter Ihren kundenspezifischen Seiten mit diesem:

    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 (ByVal Absender als Gegenstand, ByVal e As DetailsViewInsertedEventArgs)     Wenn e.Exception Ist OrElse Nichts e.ExceptionHandled Dann         System.Web.UI.ScriptManager.RegisterClientScriptBlock (Me, Me.GetType "CLOSE_WINDOW", "window.opener.location.reload (true); self.close ();", True)     End If End Sub

  5. Erstellen Sie eine benutzerdefinierte FieldTemplate vom ForeignKey_Edit und nennen Sie es ForeignLinkKey_Edit.ascx. Nach der DropDownList1 Steuerung, fügen Sie zwei Räume () und dann die asp erstellen: Linkbutton, wie er erklärte. Setzen Sie Text wie „Add __“ oder so ähnlich. Ersetzen Sie die Seite Load-Funktion mit diesem:

    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") ersetzen ( "Insert.aspx", "popup_Insert.aspx") & _ " ''" & "Fk_popup_" & ForeignKeyColumn.ParentTable.Name & " 'config ='" & _ "Height = 400, width = 400, toolbar = no, menubar = nein, scrollbars = no, resizable = no, location = nein, Verzeichnisse = no, status = no" & "'); return false;"     End If     Wenn Request ( "__ eventargument") = "refresh" Dann         DropDownList1.Items.Clear ()         Wenn nicht Column.IsRequired Dann             DropDownList1.Items.Add (New ListItem ( "[Nicht festgelegt]", ""))         End If         PopulateListControl (DropDownList1)         DropDownList1.SelectedIndex = DropDownList1.Items.Count - 1     End If End Sub

  6. ignorieren die Erweiterungen Funktionen.

  7. Sie die aktualisierte Routing vorgeschlagen. . Hinweis: Wenn Sie benutzerdefinierte Routen verwenden, werden Sie damit basteln, bis das Routing korrekt ist

Oder habe ich nur zwei server-Steuerelemente und ein blog-Beitrag hier:Ein Popup-Steuerelement Einfügen, für Dynamische Daten das macht so ziemlich das gleiche, aber kapselt die popup-Funktionalität in den server steuert Sie einen Wert bak aus dem popup-Fenster auf main Fenster und popup-Taste.

Jede neue Funktionen in Dynamic Data in der VS2010 RC? Werden wir noch solche Hacks zurückgreifen müssen, da diese für einfache Master-Informationen in Dynamic Data unter diesem RC?

Wir freuen uns auf einigen Blog-Posts auf DD unter VS2010 RC ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top