Обязательное поле валидатора для нескольких раскрывающихся списков на странице aspx - PullRequest
0 голосов
/ 25 октября 2010

У меня есть страница aspx с 18 (да 18) выпадающими списками и 18 текстовыми полями.Каждый раскрывающийся список должен быть выбран, и каждое текстовое поле должно быть заполнено.Перетаскивание необходимых валидаторов полей на этих 36 элементах управления и их обслуживание - трудная задача, и она не кажется логичной, поскольку все, что мне нужно, - это выбрать значение из раскрывающегося списка.

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

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

Используйте CustomValidator и используйте функцию клиентского скрипта, которая гарантирует, что каждое текстовое поле / раскрывающийся список имеет значение.

0 голосов
/ 25 октября 2010

Если вы динамически генерируете текстовые поля и раскрывающиеся списки, вы, вероятно, захотите также динамически генерировать элементы управления проверкой, но если все раскрывающиеся списки и текстовые поля являются статическими, вы можете использовать следующее:

ИспользоватьCustomValidator Web Control, написать метод javascript на стороне клиента, который проверяет все свойства раскрывающихся списков и текстовых полей, настраивает функцию ClientValidationFunction веб-элемента управления с помощью функции и устанавливает EnableClientScript = true.Кроме того, из-за того, что не все пользователи имеют включенный JavaScript, плюс, чтобы быть уверенным, что это лучший метод, всегда также создавайте функцию проверки на стороне сервера и вызывайте Page.IsValid () для действия отправки.

.aspx Пример кода

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" 

Inherits="Default2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script language="javascript" type="text/javascript">
        function ValidateMe(sender, args) {
            var txt = document.getElementById("txt");
            if (txt.value != "")
                args.IsValid = true;
            else
                args.IsValid = false;
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:TextBox id="txt" runat="server" />
        <asp:CustomValidator ClientValidationFunction="ValidateMe" ID="custval" 
            runat="server" ErrorMessage="Fail" onservervalidate="custval_ServerValidate" />
        <asp:Button ID="btn" runat="server" Text="push" onclick="btn_Click1" />
    </form>
</body>
</html>

c # Код за примером кода

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using System.Threading;


public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {

        }


    }

    protected void btn_Click1(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            btn.Text = "PASS";
        }
        else
        {
            btn.Text = "FAIL";
        }
    }
    protected void custval_ServerValidate(object source, ServerValidateEventArgs args)
    {
        if (txt.Text != "")
            custval.IsValid = true;
        else
            custval.IsValid = false;
    }
}
0 голосов
/ 25 октября 2010

Одно из предложений - перебрать все элементы управления на странице, использовать рекурсивную функцию для динамического связывания RequiredFieldValidator с найденными элементами управления. Вы можете настроить мой код в соответствии с вашими потребностями.

Этот код имеет некоторые недостатки:

  1. Использовать control.ID вместо ассоциированного текста метки
  2. Добавление RequiredFieldValidator к page.controls изменит его ControlCollection. Это сломает метод foreach. Таким образом, я могу только добавить RequiredFieldValidator в Panel.


.aspx

<asp:Panel ID="pnlValidation" runat="server">
</asp:Panel>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
<br />
<asp:DropDownList ID="DropDownList1" runat="server" />
<asp:DropDownList ID="DropDownList2" runat="server" />
<asp:DropDownList ID="DropDownList3" runat="server" />
<br />
<asp:Button ID="Button1" runat="server" Text="Button" />


.cs

protected void Page_Load(object sender, EventArgs e)
{
    AddValidator(this);
}

private void AddValidator(Control ctrl)
{
    if (ctrl is TextBox || ctrl is DropDownList)
    {
        RequiredFieldValidator rfv = new RequiredFieldValidator();
        rfv.ControlToValidate = ctrl.ID;
        rfv.Display = ValidatorDisplay.Dynamic;
        rfv.ErrorMessage = ctrl.ID + " is required<br />";
        pnlValidation.Controls.Add(rfv);
    }

    foreach (Control subctrl in ctrl.Controls)
        AddValidator(subctrl);
}
...