Новая кнопка для полей внешнего ключа в динамических данных - PullRequest
1 голос
/ 26 октября 2009

На странице лесов в динамических данных ASP.NET, если у сущности есть поле внешнего ключа и искомое значение отсутствует в таблице первичного ключа, т. Е. Отсутствует в раскрывающемся списке, необходимо отказаться внесите изменения в объект, добавьте искомое значение внешнего ключа в его таблицу и вернитесь к исходному объекту.

Как можно добавить ссылку / кнопку «Создать» в шаблон поля внешнего ключа, которая откроет новое окно (сделает панель видимой), где вы можете добавить искомое значение и затем обновить раскрывающийся список ?

Ответы [ 4 ]

3 голосов
/ 15 ноября 2009

Вы имеете в виду, как в интерфейсе администратора django;). В настоящее время я пытаюсь реализовать эту функцию, я опубликую код здесь, если я заставлю его работать.

EDIT:

Хорошо, я получил это на работу, полный стиль Джанго ... Это довольно долго объяснять, но на самом деле просто.

Файлы для создания:

admin_popup.master, чтобы иметь хорошую всплывающую страницу (скопируйте admin.master без заголовка).

popup_Insert.aspx с admin_popup.master в качестве мастера. (скопируйте файл Insert.aspx)

Модификация

На ваш admin.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);
}

В вашем admin_popup.master добавьте эти атрибуты в тег body (он используется для изменения размера poup)

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

В вашем 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);        
}

В popup_Insert.aspx.cs замените эти две функции:

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

В ForeignKey_Edit.ascx добавьте LinkButton (ID = LinkButton1) и в ForeignKey_Edit.ascx.cs замените эту функцию

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

И, наконец, две функции расширений, которые я использую (поместите туда, куда хотите):

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

В вашем global.asax зарегистрируйте новый маршрут, изменив эту строку:

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

Хорошо, надеюсь, я ничего не забыл ... Это, конечно, можно улучшить, но это работает. Хорошо, я надеюсь, что некоторые люди найдут это полезным, это делает ASP.NET Dynamic Data намного лучше;). Теперь я собираюсь взглянуть на отношения многие ко многим.

2 голосов
/ 21 февраля 2011

ВНИМАНИЕ: ПОЛЬЗОВАТЕЛИ VB.net

Если вы были похожи на меня и недовольны тем, насколько запутанными и беспорядочными являются динамические данные, это для ВАС! Мне потребовалось более 100 часов, чтобы понять основы DD (хотя я очень разбираюсь в других технике по программированию баз данных).

Решение Гийома для нас гораздо проще, чем Нотона. После 15 с лишним часов попыток перевести Нотона, я попытался перевести код Гийома, и мне потребовалось всего 2 часа, чтобы добраться до работы. Здесь это в том же порядке. (Примечание: расширения cs, конечно, переводятся в расширения vb)

  1. Игнорировать указания admin.master.cs.

  2. Сделайте код admin_popup.master. Если вы все еще в VS 2008 или старше, вы получите ошибку CSS в цитате встроенного блока. Игнорировать ошибку.

  3. МАСТЕР-ФАЙЛ 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. Замените события в (popup_Insert.aspx.vb) под вашими пользовательскими страницами следующим образом:

    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 Защищенный Sub DetailsView1_ItemInserted (ByVal отправитель как объект, ByVal e как DetailsViewInsertedEventArgs) Если e.Exception ничто, или eEExceptionHandled System.Web.UI.ScriptManager.RegisterClientScriptBlock (Me, Me.GetType, «Close_Window», «window.opener.location.reload (true); self.close ();», True) End If End Sub

  5. Создайте пользовательский шаблон FieldTemplate из ForeignKey_Edit и назовите его ForeignLinkKey_Edit.ascx. После элемента управления dropdownlist1 добавьте два пробела () и затем создайте asp: LinkButton, как он сказал. Поместите текст вроде «Добавить __» или что-то в этом роде. Замените функцию загрузки страницы следующим:

    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 ("Вставить"). Replace ("Insert.aspx", "popup_Insert.aspx") & _ "','" & "fk_popup_" & ForeignKeyColumn.ParentTable.Name & "', config ='" & _ "высота = 400, ширина = 400, панель инструментов = нет, меню = нет, полосы прокрутки = нет, изменяемый размер = нет, расположение = нет, каталоги = нет, статус = нет" & "'); вернуть false;" End If If Request ("__ eventargument") = "refresh" Тогда DropDownList1.Items.Clear () Если не столбец. Требуется то DropDownList1.Items.Add (New ListItem ("[Не установлено]", "")) End If PopulateListControl (DropDownList1) DropDownList1.SelectedIndex = DropDownList1.Items.Count - 1 End If Конец Sub

  6. Игнорировать функции расширений.

  7. Сделайте предложенную обновленную маршрутизацию. Примечание. Если вы используете пользовательские маршруты, вам придется возиться с ними до тех пор, пока маршрутизация не будет правильной.

1 голос
/ 12 февраля 2010

Какие-нибудь новые функции в динамических данных в VS2010 RC? Придется ли нам прибегать к таким хаки для простых основных данных в динамических данных под этим RC?

С нетерпением жду некоторых публикаций в блоге о DD под VS2010 RC ...

1 голос
/ 29 декабря 2009

Или я только что создал два серверных элемента управления и запись в блоге здесь: Элемент управления всплывающими окнами для динамических данных , который делает почти то же самое, но инкапсулирует функциональность всплывающих окон на сервере и передает значение bak из всплывающих окон в основные окна и всплывающую кнопку.

...