按钮点击随机工作asp.net

时间:2014-07-02 08:43:34

标签: c# asp.net button postback

我的asp.net网页上有一个RadMultipage控件。

我正在将用户控件加载为此控件中的页面。

以下是加载用户控件的代码。

 protected void RadMultiPage1_PageViewCreated(object sender, Telerik.Web.UI.RadMultiPageEventArgs e)
    {
        try
        {
            string controlName;
            int index = e.PageView.ID.Trim().IndexOf(" ");
            if (index > 0)
            { controlName = e.PageView.ID.Trim().Remove(index); }
            else
            { controlName = e.PageView.ID; }

            Control pageViewContents = LoadControl(controlName + ".ascx");
            pageViewContents.ID = e.PageView.ID + "userControl";
            e.PageView.Controls.Add(pageViewContents);
        }
        catch (Exception ex)
        {
            Utility.WalkException(this, ex, "There was an error while performing this operation.");
        }
    }

我还启用了视图状态和autoeventwireup。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" EnableViewState="true" ViewStateMode="Enabled" Inherits="VentureAssessmentApp.Default" %>

现在我遇到的问题是用户控件上的按钮。该按钮的单击事件不会被触发。它只是重新加载页面。即使IsPostBack返回false也是如此。

任何人都可以建议一些解决方案吗?碰巧有时候点击事件会起作用,而且大部分时间它都不起作用。

2 个答案:

答案 0 :(得分:1)

这是典型的页面生命周期问题。我猜测正在发生的事情是,当回发被触发时,页面不知道哪个控件触发了回发,因为当它进行评估时,Button(及其父UserControl)尚未添加到页面的控件层次结构中...所以,我将手指指向RadMultiPage1_PageViewCreated事件处理程序。它看起来像是一个动态添加服务器控件到页面的尴尬的地方。

建议

将控制加载逻辑移出RadMultiPage1_PageViewCreated事件。如果Init事件过早,请将此逻辑放在网页的Load事件或页面的Init事件中。

您可以通过检查RadMultiPage属性或SelectedIndex属性来确定在SelectedPageView控件中选择了哪个页面。但是,如果您将RadTabStrip控件与RadMultiPage控件结合使用,则可以检查RadTabStrip的{​​{1}}或SelectedTab属性

实施例

SelectedIndex

答案 1 :(得分:0)

最后我发现了这个问题。请完成This Answer。这正是我的解决方案中发生的事情。

  

当向无映射URL发出请求时,ASP.NET 4现在将HTML表单元素的action属性值呈现为空字符串,该URL具有映射到它的默认文档。例如,在早期版本的ASP.NET中,对http://contoso.com的请求将导致对Default.aspx的请求。在该文档中,开始表单标记将如下例所示呈现:

     

  在ASP.NET 4中,对http://contoso.com的请求也会导致对Default.aspx的请求。但是,ASP.NET现在呈现HTML开始表单标记,如以下示例所示:

     

  如何呈现action属性的这种差异可能会导致IIS和ASP.NET处理表单帖子的方式发生细微变化。当action属性为空字符串时,IIS DefaultDocumentModule对象将创建对Default.aspx的子请求。在大多数情况下,此子请求对应用程序代码是透明的,Default.aspx页面正常运行。

     

但是,托管代码与IIS 7或IIS 7.5集成模式之间的潜在交互可能导致托管的.aspx页面在子请求期间停止正常工作。

将此添加到global.ascx以解决此问题。

void Application_BeginRequest(object sender, EventArgs e)
{
    var app = (HttpApplication)sender;
    if (app.Context.Request.Url.LocalPath.EndsWith("/"))
    {
    app.Context.RewritePath(
             string.Concat(app.Context.Request.Url.LocalPath, "default.aspx"));
    }
}

希望这会有所帮助。

感谢。