使用RegisterClientScriptBlock丢失了Asp.Net ViewState

时间:2009-01-11 04:12:30

标签: c# asp.net javascript

我正在使用服务器端生成的Javascript验证邮政编码,并在点击LinkBut​​ton时注入。然后,我通过在页面加载时调用服务器端函数来检索返回值。

这很好用,但问题是在PostBack之后ViewState完全丢失了。下面是代码,从page_load事件,按钮单击事件开始,然后是从page_load事件调用的回调。

有没有办法可以以某种方式保存ViewState,可能很容易在会话变量中?或者我有可以使用的解决方法吗?

// In Page_Load
if (Request.Form["__EVENTTARGET"] == "CallFunction") {
    GetValidateZipCodeScriptReturnValue(Boolean.Parse(Request.Form["__EVENTARGUMENT"].ToString()));
}

// OnClick for LinkButton
private bool ValidateZipCode(string zip) {
    StringBuilder script = new StringBuilder();
    script.Append("<script language='javascript' type='text/javascript'>");
    script.Append(@"var regex = /^\d{5}$|^\d{5}-\d{4}$/;");
    script.Append("__doPostBack('CallFunction', regex.test(" + zip + "));");
    script.Append("</script>");

    Type t = GetType();

    if (!ClientScript.IsClientScriptBlockRegistered(t, "ValidateZipCodeScript")) {
        ClientScript.RegisterClientScriptBlock(t, "ValidateZipCodeScript", script.ToString());
    }

    return false;
}

// Method called on PostBack to get the return value of the javascript
private void GetValidateZipCodeScriptReturnValue(bool valid) {
    m_ZipCode = uxZip.Text;

    if (valid) {
        Response.Redirect(string.Format("~/checkout/overview.aspx?pc={0}&zc={1}",
        ProductCode, ZipCode));
    }
    else {
        Alert.Show("The entered zip code is invalid. Please ensure the zip code is a valid zip code.");
        SetupPostBackViewState();
        ScrollToZipCode();
    }
}

1 个答案:

答案 0 :(得分:0)

为什么不直接使用OnClick的{​​{1}}事件?或者,更好的是,查看CustomValidator控件,因为看起来你要做的就是验证邮政编码,这正是LinkButton可以做的(你需要看一下)在ClientValidationFunction,这是你想要进行正则表达式测试的地方。)