CustomValidator не запускает управление

Итак, вот в чем проблема. У меня есть DropDownList в элементе управления .ascx с CustomValidator. Этот элемент управления имеет ValidationGroup, установленную свойством в PageLoad. Кнопка, запускающая проверку, находится в другом файле, который использует этот элемент управления. Проблема в том, что проверка на стороне сервера никогда не запускается. Я добавляю в него точки останова, и они никогда не срабатывают. У кого-нибудь есть мысли о том, что происходит? Вот код:

Dropdown.ascx:

    <asp:DropDownList ID="ddlQuestions" runat="server">
    </asp:DropDownList>
    <asp:CustomValidator runat="server" ID="cvddlQuestions" OnServerValidate="cvddlQuestions_ServerValidate"
         ErrorMessage="* Parent question is required." ValidateEmptyText="true" Display="Dynamic" />
    </p>
</div>

Код позади:

protected void Page_Load(object sender, EventArgs e)
{
    cvddlQuestions.ValidationGroup = ValidationGroup; 
    //ValidationGroup is a property in the parent file that is being set on PageLoad
}

protected void cvddlQuestions_ServerValidate(object sender, ServerValidateEventArgs args)
{
    args.IsValid = false;// (ddlQuestions.SelectedValue != "-1");
}

В родительском файле, который использует Dropdown.ascx, у меня есть эта кнопка:

<asp:LinkButton ID="btnQuestionAdd" runat="server" OnClick="btnQuestionAdd_Click" 
    ValidationGroup="editQuestion" CommandName="add" />

Код родительских файлов:

protected void btnQuestionAdd_Click(object sender, EventArgs e)
{
    Page.Validate("editQuestion");
    if (Page.IsValid)   //ALWAYS SEEMS TO BE TRUE
    {
        //Do something
    }
}

Когда я добавляю функцию проверки клиента в customvalidator, это не вызывает проблем. Но страница ВСЕГДА возвращается как действительная. Я попытался добавить ControlToValidate и установить ValidateEmptyText = "true", но все равно получаю тот же результат. Что мне не хватает?


person Icestorm0141    schedule 26.09.2011    source источник


Ответы (2)


Установите свойство CausesValidation в DropDownList до true, по умолчанию false.

<asp:DropDownList ID="ddlQuestions" CausesValidation="True" CssClass="if" DataTextField="Question" DataValueField="iD" runat="server">

И вы также должны соответствующим образом установить его свойство Validationgroup (см. Свойство ниже).

Примечание: вам не нужна переменная-член ValidationGroup в вашем UserControl. Просто используйте общедоступное свойство ValidationGroup, которое напрямую устанавливает / получает свойство ValidationGroup валидатора. Таким образом, вам не нужно устанавливать его при каждой обратной передаче, поскольку он в любом случае хранится во ViewState, и вы также можете установить его в самом UserControl, если хотите.

public string ValidationGroup {
    get { return cvddlQuestions.ValidationGroup; }
    set { cvddlQuestions.ValidationGroup = value; ddlQuestions.ValidationGroup=value; }
}
person Tim Schmelter    schedule 26.09.2011
comment
К сожалению, это не имело значения :( Спасибо за предложение по собственности, звучит как хорошее предложение - person Icestorm0141; 27.09.2011

Оказывается, ответ был невероятно глупым. Когда я создал экземпляр элемента управления, внутри которого находился весь этот код, мне пришлось установить свойство ValidationGroup во внешнем интерфейсе, а не во внутреннем.

Допустим, опубликованный мной код находился в файле .ascx с именем QuestionControl.ascx. После регистрации элемента управления на своей странице мне пришлось написать следующее:

<asp:QuestionControl runat="server" id="qcPage" ValidationGroup="editQuestion" />

Понятия не имею, почему говорят:

qcPage.ValidationGroup = "editQuestion";

не сработало, так как свойство было всего лишь строкой.

person Icestorm0141    schedule 11.10.2011