ASP.NET中按钮单击的工作随机进行。

3
我在我的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.");
        }
    }

我还启用了视图状态和自动事件处理。

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

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

有人能提供一些解决方案吗?有时候点击事件有效,大多数情况下则无效。


如果您动态创建控件,则通常应在每次PostBack后重新创建它们。也许您放置代码的事件仅在控件首次加载或第一次创建页面时触发。请还要说明用户控件中的Button是动态添加的还是在**.ascx*标记中声明的。 - Lukasz M
请确认 RadMultiPage1_PageViewCreated 方法是否在每次回发时都会触发。如果不是,则应将创建控件的代码放置在 Page_InitPage_Load 页面事件处理程序中。在 RadMultiPage1_PageViewCreated 方法中,只需设置一个标志以指示是否应创建控件。 - Lukasz M
@LukaszM RadMultiPage1_PageViewCreated 会在每次 postback(如页面加载和按钮点击)时触发。但是在按钮点击时,IsPostBack 仍然为 false。 - Sachin Trivedi
很可能控件添加得太晚了,无法正常工作,请尝试将添加控件的代码移动到Page_InitPage_Load页面事件处理程序中,如Leo所建议的那样。 - Lukasz M
@LukaszM 让我试试。 - Sachin Trivedi
显示剩余3条评论
2个回答

1
这是一个典型的页面生命周期问题。我猜测触发PostBack时,页面不知道哪个控件触发了PostBack,因为在进行评估时,Button(及其父UserControl)尚未添加到页面的控件层次结构中...所以,我会把指向RadMultiPage1_PageViewCreated事件处理程序。对我来说,这似乎是一个动态向页面添加服务器控件的尴尬位置。
建议:将控件加载逻辑移出RadMultiPage1_PageViewCreated事件。将此逻辑放置在页面的Init事件中,或者如果Init事件太早,则放置在页面的Load事件中。
您可以通过检查SelectedIndex属性或SelectedPageView属性确定在RadMultiPage控件中选择了哪个页面。但是,如果您与RadMultiPage控件一起使用RadTabStrip控件,则可以检查RadTabStripSelectedTabSelectedIndex属性来确定所选页面。

示例

protected override void OnLoad(EventArgs e)
{
    LoadStuff();
}

private void LoadStuff()
{
        try
        {
            string controlName;
            int index = YOUR_MULTI_PAGE_CONTROL.SelectedIndex;
            if (index > 0)
            { controlName = YOUR_MULTI_PAGE_CONTROL.PageViews[index].ID.Trim().Remove(index); }
            else
            { controlName = YOUR_MULTI_PAGE_CONTROL.PageViews[index].ID; }

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

是的,我正在使用RadTabStrip控件。我会尝试按照您的建议修改代码。我还会等待您的示例:P 谢谢。 - Sachin Trivedi
这是有用的解释,所以给它点赞。但在我的情况下似乎还有其他问题。感谢您的关注。也许我会尝试挖掘更深,并找出真正的原因。 - Sachin Trivedi
在这种情况下,您需要提供一些额外的信息。您如何处理您的PageViews?您是以声明方式还是命令方式创建它们的? - Leo
我正在收集用户的一些信息,例如电子邮件和电话号码,当我点击下一个按钮时,它将加载下一页视图。因此,它更像是向导。 - Sachin Trivedi
我已经提到我正在动态创建它们。因此,当我的页面在RadMultiPage1_PageViewCreated中首次加载时,我会加载第一个用户控件。然后,当用户填写所需的详细信息并按下“下一步”时,我会加载下一个用户控件。 - Sachin Trivedi
显示剩余5条评论

0

终于我找到了问题所在。请查看这个答案。这正是我的解决方案中发生的情况。

ASP.NET 4现在将HTML表单元素的action属性值呈现为空字符串,当请求发送到一个没有扩展名的URL,并且该URL映射到默认文档时。例如,在早期版本的ASP.NET中,对http://contoso.com的请求会导致对Default.aspx的请求。在该文档中,开放式表单标记将被呈现如下所示:
在ASP.NET 4中,对http://contoso.com的请求也会导致对Default.aspx的请求。然而,ASP.NET现在将HTML开放式表单标记呈现如下所示:
在呈现操作属性方面的这种差异可能会导致IIS和ASP.NET处理表单提交的方式发生微妙的变化。当操作属性为空字符串时,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"));
    }
}

希望这对你有所帮助。
谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接