RegisterForEventValidation .net 3.5 gridview строка, как? - PullRequest
1 голос
/ 25 февраля 2011

У меня есть элемент управления gridview, и в исходной сборке я установил атрибут grid:

AutoGenerateSelectButton="True"

Это было приятно и позволило мне делать постбэки, когда была выбрана строка в моем виде сетки. Тем не менее, я не был доволен, поскольку он действительно не действовал как хороший список, и я хотел, чтобы пользователь мог щелкнуть в любом месте строки, чтобы выбрать его, а не нажимать кнопку выбора. Поэтому я посмотрел на базовый код, нашел функцию, вызываемую кнопкой выбора, и добавил ее в событие RowDataBound:

protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onclick", "javascript:__doPostBack('grid','Select$" + e.Row.RowIndex + "')");
        }
    }

Круто, тогда я пошёл убрать кнопку «выбрать» и теперь я получаю сообщение об ошибке

Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Хорошо, я исследовал в Интернете и обнаружил, что мне нужно зарегистрировать событие (да, вызываемый javascript все еще там), поэтому я добавил этот код:

<script runat="server">
    protected override void Render(HtmlTextWriter writer)
    {
        foreach (GridViewRow r in grid.Rows)
        {
            if (r.RowType == DataControlRowType.DataRow)
            {
                Page.ClientScript.RegisterForEventValidation(r.UniqueID);
            }
        }

        base.Render(writer);
    }
</script>

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

Ответы [ 3 ]

4 голосов
/ 01 марта 2013

Решение в C #:

protected override void Render(HtmlTextWriter writer) {

    foreach (GridViewRow r in gridviewPools.Rows) {
        if (r.RowType == DataControlRowType.DataRow) {
            Page.ClientScript.RegisterForEventValidation(gridviewPools.UniqueID, "Select$" + r.RowIndex);
        }
    }

    base.Render(writer);
}
0 голосов
/ 09 января 2014

r.UniqueID даст вам что-то вроде yourGridViewID $ ctl0n ... Так что попробуйте

protected override void Render(HtmlTextWriter writer)
{
    foreach(GridViewRow r in Gv.Rows)
    {
        if(r.RowType==DataControlRowType.DataRow)
        {
            Page.ClientScript.RegisterForEventValidation(r.UniqueID + "$ctl00");
        }
    base.Render(writer);
}
0 голосов
/ 30 июля 2012

Необходимо зарегистрировать элемент управления и eventArgs:

If r.RowType = DataControlRowType.DataRow Then
    Page.ClientScript.RegisterForEventValidation(Me.GridView1.UniqueID, "Select$" & r.RowIndex)
End If
...