Переопределить SharePoint: SaveButton в пользовательском шаблоне формы - PullRequest
2 голосов
/ 09 марта 2011

Сначала позвольте мне очистить эфир и опубликовать статьи, в которых уже объясняется, как переопределить кнопку SaveButton:

Я прочитал эти ипонял их, я просто не знаю, как полностью реализовать это в моем конкретном случае:

У меня есть пользовательский шаблон рендеринга " CustomRender ", который включает в себя "реальную форму".Код для реальной формы выглядит примерно так:

<%@ Register TagPrefix="wssuc" TagName="ToolBar"
             src="~/_controltemplates/ToolBar.ascx" %>
<%@ Control Language="C#" AutoEventWireup="true"
    CodeBehind="RealForm.ascx.cs" Inherits="CustomNameSpace.CustomForm" %>
<p>Test</p>
<wssuc:ToolBar runat="server" id="toolbar">
    <TemplateButtons>
        <SharePoint:SaveButton runat="server" />
    </TemplateButtons>
</wssuc:ToolBar>

Теперь я хочу переопределить эту кнопку сохранения.Сайты выше утверждают, что мне просто нужно написать еще один элемент управления, который переопределяет кнопку.Например:

public class NewSaveButton: SaveButton

{
    protected override bool SaveItem()

    {
        bool success = base.SaveItem();

        RedirectUrl = String.Concat(List.ParentWeb.ServerRelativeUrl, "/",
                      List.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url, @"?ID=", 
                      ListItem.ID, @"&Source=", ListItem.ParentList.DefaultViewUrl);
        return success;

    }
}

Теперь я просто не знаю, как зарегистрировать этот шаблон в моем другом шаблоне.Могу ли я не просто переопределить кнопку SaveButton в коде позади моего шаблона - как бы я сделал это и сослаться на него позже?

  • Вариант 1: код позади формы (RealForm.ascx.cs) -я могу просто добавить туда метод переопределения?Как я могу ссылаться на кнопку тогда в форме (как я могу получить <NewSaveButton>)?
  • Вариант два: Другой шаблон только для кнопки, например, SaveButton.ascx "- как мне ссылаться на это через <%@ Register... %> т. е. как я узнаю PublicKeyToken и т. д. при развертывании с помощью функции. И здесь тоже самое: моя цель - получить какой-то элемент управления <NewSaveButton> для формы.

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

Когда вы делаете это, вы создаете новый серверный элемент управления, поэтому вам нужно зарегистрировать новый элемент управления на странице (или в этом случае в файле шаблона .ascx).

<%@ Register TagPrefix="MyPrefix" Namespace="ControlNamespace" Assembly="MyFullyQualifiedAssembly" %>

В своем кодовом файле вы можете добавить ToolboxDataAttribute к классу (это необходимо, только если вы перетаскиваете элемент управления с панели инструментов в Visual Studio)

[ToolboxData("<{0}:NewSaveButton runat=\"server\"></{0}:NewSaveButton>")]
public class NewSaveButton : SaveButton {}

Теперь у вас должна быть возможность заменить кнопку сохранения в форме следующим текстом:

<MyPrefix:NewSaveButton runat="server"></MyPrefix:NewSaveButton>

В основном вы создаете новый серверный элемент управления, следуя правилам asp.net (никаких специальных ресурсов для sharepoint нет.происходит здесь).

Для получения дополнительной информации, посмотрите на этой странице: http://msdn.microsoft.com/en-us/library/yhzc935f(v=VS.85).aspx

2 голосов
/ 23 октября 2014

На вашей странице с помощью SaveButton вы можете сделать следующий трюк (в моем случае кнопка сохранения добавляется в разметке XSL DataFormWebPart):

// On your page with SaveButton you could do the following trick 
// (in my case save button is added in DataFormWebPart's XSL markup):

SPContext itemContext;
DataFormWebPart dataForm; // from designer's code behind

void Page_Init(object sender, EventArgs e)
{
    // NOTE: by some reason ItemContexts of controls in DFWP are differ,
    // so only SaveButton's OnSaveHandler is invoked
    itemContext = dataForm.Controls.FindControlRecursive<SaveButton>().ItemContext;
}

void Page_Load(object sender, EventArgs e)
{
    if (itemContext.FormContext.FormMode == SPControlMode.New ||
        itemContext.FormContext.FormMode == SPControlMode.Edit)
    {
        itemContext.FormContext.OnSaveHandler += OnSaveHandler;
    }
}

void OnSaveHandler(object sender, EventArgs eventArgs)
{
    // TODO: Add your code before saving the item
    SaveButton.SaveItem(saveButton.ItemContext, false, string.Empty);
    // TODO: Add your code after saving the item
}

Реализация расширения FindControlRecursive ():

public static class ControlExtensions
{
    public static TControl FindControlRecursive<TControl>
    (
        this ControlCollection controls
    ) where TControl : Control
    {
        if (controls != null)
        {
            foreach (Control control in controls)
            {
                var foundControl = control as TControl 
                    ?? control.Controls.FindControlRecursive();
                if (foundControl != null)
                {
                    return foundControl;
                }
            }
        }
        return null;
    }
}
...