Есть ли в ASP.NET какой-то собственный способ сделать «сообщение об успехе»? - PullRequest
9 голосов
/ 12 декабря 2008

Скажем, у вас есть что-то вроде ASP.NET ASP: DetailsView для отображения и редактирования одной записи в базе данных.

Это просто записывать случаи ошибок ... вы добавляете проверку и сводку проверки. Когда ваша форма обновления не проходит проверку, она, естественно, создает помехи: она показывает сообщение проверки и / или сводку проверки. Не требуется ни одного кода.

Но затем вы проходите валидацию, и это делает ваше обновление совершенно бесшумным. Нет никакого смысла в том, что что-то случилось, и, кажется, нет никаких настроек по умолчанию, чтобы сделать сообщение об успехе без кода.

Но даже кодовые коды сбивают с толку. Какое событие должно показать сообщение об успехе? onItemUpdate, верно? Хорошо, но тогда допустим, что вы сделали еще одно изменение и получили ошибку проверки? Ваше сообщение об успехе остается. Я не смог найти событие, которое надежно отключило бы существующее сообщение об успехе, если бы произошла ошибка проверки.

Это должна быть веб-разработка 101! Почему это так сложно?

EDIT:

Кто-то предложил использовать событие ItemCommand ... Я пробовал это и многие другие события, но это сообщение об успехе просто не исчезнет. Вот некоторый код.

Мое сообщение в ASP.NET

<label id="successMessage" class="successMessage" runat="server"></label>

И мой тег DataView (упрощенный):

    <asp:DetailsView 
        Id="EditClient"
        DataKeyNames="LicenseID" 
    DataSourceID="MySource"
    runat="server" 
        OnItemUpdated="SuccessfulClientUpdate"
        OnItemCommand="ClearMessages">

И мой код:

protected void SuccessfulClientUpdate(object sender, DetailsViewUpdatedEventArgs e)
{
    successMessage.InnerText = string.Format("Your changes were saved.");
    successMessage.Visible = true;
}

protected void ClearMessages(object sender, DetailsViewCommandEventArgs e)
{
    successMessage.InnerText = string.Empty;
    successMessage.Visible = false;
}

Однако после успешного обновления ничто не может заставить это сообщение исчезнуть, даже не прошло проверку.

2-е РЕДАКТИРОВАНИЕ:

Просто хочу пояснить, что я попытался поместить код ClearMessages в Page_Load. Тем не менее, кажется, что ничто не заставляет эту метку successMessage исчезать, когда я нажимаю обновить 2 раза С ошибкой проверки. Может кто-нибудь предложить какие-либо другие советы по устранению неполадок?

Ответы [ 4 ]

7 голосов
/ 12 декабря 2008

Насколько я знаю, нет никакого собственного способа сделать это. Вы можете рассуждать об этом, возможно, Microsoft услышит это:).

Сброс «сообщения об успехе» на Page_Load или в любом месте кода, не будет работать. Это связано с тем, что проверка ASP.NET обычно выполняется как на стороне клиента, так и на стороне сервера. Это означает, что для каждого элемента управления проверки, который вы помещаете на страницу, ASP.NET генерирует некоторый клиентский Javascript, который выполняет проверку и отображает ошибку на клиенте, без , возвращаясь на сервер. Таким образом, вы застряли с сообщением об успехе и сообщением об ошибке одновременно.

Что вы можете с этим поделать:

  • разместите на своей странице элемент управления <div>, который будет отображать сообщение об успехе (как уже было предложено другими выше). Всякий раз, когда вы обновляете что-либо (в коде на стороне сервера), показывайте элемент управления и устанавливайте значимое «Успешно!» текст сообщения.
  • зарегистрируйте пользовательскую функцию Javascript, которая будет искать <div> и скрывать ее при каждой отправке страницы. Помните, что эту функцию необходимо вызывать перед автоматически сгенерированным клиентским скриптом, который выполняет проверку.

Если вы посмотрите на клиентский источник страницы ASP.NET (с валидаторами на ней), вот что вы можете найти:

<form name="aspnetForm" method="post" action="MyPage.aspx" onsubmit="javascript:return WebForm_OnSubmit();id="aspnetForm">

WebForm_OnSubmit генерируется ASP.NET и вызывает JavaScript, который выполняет проверку. Пример:

function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false)
    return false;
return true;
}

Чтобы зарегистрировать свой пользовательский код, который скрывает сообщение об успехе, вы должны поместить (в своем коде позади) что-то вроде этого:

if (!Page.ClientScript.IsOnSubmitStatementRegistered("ClearMessage"))
{
    string script = @"document.getElementById('" + 
        yourDivControl.ClientID + "').style.display='none'";
    Page.ClientScript.RegisterOnSubmitStatement(Page.GetType(), "ClearMessage", script);
}

Это превратит автоматически сгенерированный WebForm_OnSubmit вашей страницы в следующее:

function WebForm_OnSubmit() {
    document.getElementById('ctl00_yourDivControl').style.display='none';
    if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false)
        return false;
    return true;
}

Эффект: При каждой обратной передаче (например, когда запускается ItemCommand, или когда нажимается какая-либо кнопка «Сохранить», или что-либо еще), вы будете отображать элемент управления div с сообщением «success». При следующей обратной передаче перед отправкой страницы на сервер это сообщение очищается. Конечно, если эта обратная передача также вызывает «успех», сообщение снова отображается кодом на сервере. И так далее, и тому подобное.

Надеюсь, вышесказанное полезно. Это не полноценное решение, но оно дает достаточно подсказок, чтобы указать вам правильное направление.

1 голос
/ 14 декабря 2008

Даниэль, мне нужно что-то подобное, поэтому я извлек из Label и связал его непосредственно с событиями, вызванными различными производными DataSourceControl (LinqDataSource, ObjectDataSource, SqlDataSource). Я также использовал клиентский JavaScript, чтобы скрыть метку во время проверки и / или отправки формы (как ответ Dan.C).

Элемент управления предоставляет отдельные свойства текста сообщения для успешных событий удаления, вставки и обновления.

Я опубликовал закомментированный источник для решения в http://codehq.net/files/UpdateSuccessMessage.zip

Надеюсь, это поможет.

1 голос
/ 12 декабря 2008

Используйте событие ItemCommand и выполните сброс для очистки состояния для каждой заданной команды. Затем, если при обновлении происходит сбой проверки, будет отображена ошибка проверки. Если это удастся, он покажет сообщение об успехе. Затем щелчки по кнопкам вызовут событие ItemCommand, и вы можете снова выполнить сброс, чтобы начать все сначала.

0 голосов
/ 12 декабря 2008

Почему бы не отключить сообщение проверки в Page_Load. Я предполагаю, что если сообщение будет возвращено, вы захотите избавиться от сообщения, поэтому убедитесь, что оно всегда отключено. Или отключите состояние просмотра для элемента управления, установив EnableViewState = "False" в разметке (страница aspx).

Итак:

protected void ClearMessages(object sender, DetailsViewCommandEventArgs e)
{
    successMessage.InnerText = string.Empty;    
    successMessage.Visible = false;
}

становится:

protected void Page_Load(object sender, EventArgs e)
{
    successMessage.InnerText = string.Empty;    
    successMessage.Visible = false;

}

Также в качестве примечания, если вы создаете сайты .net, вам нужно получить совместимость с кодом позади IMHO :-)

...