无效的回发或回调参数 - 按钮OnClick

时间:2018-02-20 22:53:40

标签: c# jquery asp.net webforms

我在aspx网页表单上看到过很多关于此错误的帖子。

  

无效的回发或回调参数。使用配置或<%@ Page EnableEventValidation =“true”%>启用事件验证在一个页面中。出于安全考虑,此功能可验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。

我的问题似乎有点不同。我读过的所有帖子似乎都与网格视图,下拉列表以及在Page_Load事件之外加载的其他控件相关。

在这种情况下,我通过简单的单击按钮获得此错误:

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

Button1_Click只是调用一个简单的方法。

现在,在这个Codebehind文件中,我确实有2个WebMethods从jQuery Ajax中的另一个下拉列表值加载下拉列表。我有WebMethods暴露的事实可能是错误的问题吗?

页面上的所有点击事件现已被阻止。

这是jQuery和WebMethod代码。

<script type="text/javascript">

    $("#<%= ddlJobNumber.ClientID %>").change(function (e) {

        var jobNumber = $(this).val();
        FillPhaseCode(jobNumber);
        SetDescription(jobNumber);
    });

    function FillPhaseCode(jobNumber)
    {

        $.ajax({
            type: "POST",
            <%--//url: '<% ResolveUrl("~/Pages/JobTimecard.aspx/FillPhaseCode"); %>',--%>
            url: "JobTimecard.aspx/FillPhaseCode",
            contentType: "application/json; charset=utf-8",
            data: '{"jobNumber":"' + jobNumber + '"}',
            dataType: "json",
            success: function (result) {
                $("#<%= ddlPhaseCode.ClientID %>").empty();

                $.each(result.d, function (key, value) {
                    $("#<%= ddlPhaseCode.ClientID %>").append("option value='0'>Select</option>");
                    $("#<%= ddlPhaseCode.ClientID %>").append($("<option></option>").val(value.PhaseCode).html(value.PhaseDesc));

                });

            },
            error: function ajaxError(result) {
                alert("Error result: " + result.status);
            }
        });
    }

    function SetDescription(jobNumber)
    {
        $.ajax({
            type: "POST",
            url: "JobTimecard.aspx/SetJobDescription",
            contentType: "application/json; charset=utf-8",
            data: '{"jobNumber":"' + jobNumber + '"}',
            dataType: "json",
            success: function (result) {
                $("#<%= lblJobName.ClientID %>").text(result.d);
            },
            error: function ajaxError(result) {
                alert("Error result: " + result.status);
            }
        });
    }

</script>

public class PhaseCodes
    {
        public string PhaseCode { get; set; }
        public string PhaseDesc { get; set; }
    }

    [WebMethod]
    public static List<PhaseCodes> FillPhaseCode(string jobNumber)
    {

        SpectrumSim clsSpectrum = new SpectrumSim();
        DataTable dt = new DataTable();
        dt = clsSpectrum.GetPhaseCodes(jobNumber, "1");
        List<PhaseCodes> list = new List<PhaseCodes>();
        foreach (DataRow dr in dt.Rows)
            list.Add(new PhaseCodes
            {
                PhaseCode = dr["Phase_Code"].ToString(),
                PhaseDesc = dr["Description"].ToString()
            });
        return list;
    }

    [WebMethod]
    public static string SetJobDescription(string jobNumber)
    {
        DataTable dt = new DataTable();
        SpectrumSim clsSpectrum = new SpectrumSim();
        dt = clsSpectrum.GetJobNumbers();
        var dataRow = dt.AsEnumerable().Where(x => x.Field<string>("Job_Number") == jobNumber).FirstOrDefault();
        string description = dataRow["Job_Description"].ToString();
        return description;
    }

我希望它很简单,但我找不到问题。

编辑: 这是我的页面加载事件

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            FillJobNumberDropdown();
            if (TimeId != 0)
            {
                LoadTimecard();
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

我猜测在PostBack Web Forms上检测到服务器端DropDownList中的一个值,它不能识别为有效选项,因为您正在向客户端添加选项。

客户端正在更改的DropDownList是否需要是服务器端控件?

如果是这样,您需要在Page_Load之前使用PostBack上的相同选项填充它(例如Page_Init),以便它可以识别所选的选项。

或者,改为更改为非服务器端HTML控件,并使用Request.Form获取所选值。

答案 1 :(得分:1)

要在Web窗体方案中解决此问题,我最终使用UpdatePanel来构建级联下拉列表。 HTML控件也可以使用,但我不想混合控件。