Как я могу отобразить кнопку «Сброс» в форме после отправки формы?

После отправки формы она возвращается в исходное состояние (по большей части), и мы хотим иметь кнопку «Reset», которая позволяет пользователю запускать страницу «afresh». Я надеялся, что смогу определить и настроить HtmlButton в коде:

HtmlButton btnStartNewDirPay = null;
. . .
private void CreateAndConfigureButtonStartNewDirectPayment()
{
    btnStartNewDirPay = new HtmlButton();
    btnStartNewDirPay.Attributes["type"] = "reset";
    btnStartNewDirPay.InnerHtml = "Start new Direct Pay";
    btnStartNewDirPay.ID = "btnStartNewDirPay";
} 

... и затем создайте экземпляр только на postback (после отправки form) следующим образом:

if (Page.IsPostBack) 
{
    if (null == btnStartNewDirPay)
    {
        CreateAndConfigureButtonStartNewDirectPayment();
    }
    this.Controls.Add(btnStartNewDirPay); //this causes problems
}

Но последняя строка (где кнопка добавляется к элементам управления страницы (это)), она терпит неудачу с:

Исключение System.Web.HttpException было необработано кодом пользователя. Сообщение = Не удалось загрузить состояние просмотра. Дерево элементов управления, в которое загружается состояние представления, должно совпадать с деревом элементов управления, которое использовалось для сохранения состояния представления во время предыдущего запроса. Например, при динамическом добавлении элементов управления элементы управления, добавленные во время обратной передачи, должны соответствовать типу и положению элементов управления, добавленных во время первоначального запроса.
Source=System.Web ErrorCode=-2147467259 StackTrace: в System.Web. UI.Control.LoadViewStateRecursive(Object saveState) в System.Web.UI.Control.AddedControl(элемент управления, индекс Int32) в DirectPaymentSectionsWebPart.DPSVisualWebPart.DPSVisualWebPartUserControl.Page_Load(отправитель объекта, EventArgs e) в System.Web.Util.CalliHelper. EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) в System.Web.Util.CalliEventHandlerDelegateProxy.Callback(отправитель объекта, EventArgs e) в System.Web.UI.Control.OnLoad(EventArgs e) в System.Web. UI.Control.LoadRecursive() в System.Web.UI.Control.LoadRecursive() в System.Web.UI.Control.LoadRecursive() в System.Web.UI.Control.LoadRecursive() в System.Web.UI. Ко ntrol.LoadRecursive() в System.Web.UI.Control.LoadRecursive() в System.Web.UI.Control.LoadRecursive() в System.Web.UI.Page.ProcessRequestMain(логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint)
InnerException :

Я также попытался создать/настроить HtmlButton в начале (когда IsPostBack был ложным), добавив элемент управления «это» из git-go, например:

private void CreateAndConfigureButtonStartNewDirectPayment()
{
    btnStartNewDirPay = new HtmlButton();
    btnStartNewDirPay.Attributes["type"] = "reset";
    btnStartNewDirPay.InnerHtml = "Start new Direct Pay";
    btnStartNewDirPay.ID = "btnStartNewDirPay";
    this.Controls.Add(btnStartNewDirPay);
} 

... а затем скрыть его через jQuery:

$(window).load(function () {
    . . .
        $('[id$=btnStartNewDirPay]').hide();
});

... но это также не удалось в той же строке ("this.Controls.Add(btnStartNewDirPay);") в "CreateAndConfigureButtonStartNewDirectPayment()" с тем же сообщением об ошибке, что и выше, когда IsPostBack имеет значение true.

Таким образом, это не позволит мне создать и скрыть HtmlButton в начале, а затем показать его, когда IsPostBack имеет значение true; Похоже, это также не позволит мне отложить создание экземпляра до того момента, когда IsPostBack имеет значение true. Конечно, можно иметь элемент, который отображается после обратной передачи, но не до нее... но как?


person B. Clay Shannon    schedule 10.08.2015    source источник


Ответы (1)


На этом создание новой кнопки закончено.

Просто добавьте кнопку в вид и сделайте ее видимой = ложной.

<asp:Button id="btnStartNewDirPay" ClientIDMode="Static" Text="Reset" runat="server" Visible="False" />

Установите для ClientIDMode значение static, чтобы идентификатор было легче получить с помощью jQuery.

Затем при публикации в конце сохранения установите для параметра visible значение true.

if(IsPostBack)
{
    ....
    btnStartNewDirPay.Visible = true;
}

На переднем конце есть прослушиватель кликов

$(document).ready(function(){
    $("#btnStartNewDirPay").click(function(){
        //Reset inputs to default values.
    })
})
person mattfetz    schedule 10.08.2015
comment
Разве там тоже не должно быть type=reset? - person B. Clay Shannon; 11.08.2015
comment
Ну, моя реализация не будет использовать тип кнопки сброса. Я бы просто использовал jquery/js, чтобы очистить поля, которые вы могли бы легко сделать на самом деле. Простой $('form').find("input[type=text], textarea").val("");. Таким образом, у вас будет немного больше контроля над тем, что вы сбрасываете. - person mattfetz; 11.08.2015
comment
Интересная идея, но мне нужно, чтобы это работало на всей странице, на которой нет форм. Есть ли сокращение jQuery для всего (сама страница не имеет идентификатора, на который можно сослаться, я не думаю). - person B. Clay Shannon; 11.08.2015
comment
Вы можете добавить класс к каждому входу и выбрать на нем $(".someClass").val(""). Если вы не хотите добавлять класс, вы можете использовать этот stackoverflow.com/a/10892768/4488112. - person mattfetz; 11.08.2015
comment
Я понял, что мне также нужно снять флажки и радиокнопки, поэтому я могу застрять в написании кода, чтобы явно сделать все это. - person B. Clay Shannon; 11.08.2015