【问题标题】:Button click works randomly asp.net按钮单击随机工作 asp.net
【发布时间】:2014-08-22 23:31:02
【问题描述】:

我的 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。

任何人都可以提出一些解决方案吗?碰巧点击事件有时会起作用,而大多数时候它不起作用。

【问题讨论】:

  • 如果您动态创建控件,您通常应该在每次回发后重新创建它们。也许您将代码放入的事件可能仅在控制首次加载或创建第一页时触发。如果用户控件中的Button 也是动态添加的,或者在 *.ascx 文件中的标记中声明,也请写明。
  • @LukaszM 该按钮在 *.ascx 文件的 makup 中声明。但它有时会触发点击事件,有时不会。
  • 请确认每次回发时是否触发RadMultiPage1_PageViewCreated 方法。如果没有,您应该将创建控件的代码放在Page_Init 或Page_Load 页面事件处理程序中。在RadMultiPage1_PageViewCreated 方法中只需设置一个标志来指示是否应创建控件。
  • @LukaszM RadMultiPage1_PageViewCreated 每次在页面加载和按钮点击等回发时都会被触发。但是按钮单击时 IsPostBack 仍然是错误的。
  • 可能是控件添加得太晚而无法正常工作,请尝试将向页面添加控件的代码移动到Page_Init 或Page_Load 页面事件处理程序,如建议的狮子座.

标签: c# asp.net button postback


【解决方案1】:

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

建议

将控件加载逻辑移出RadMultiPage1_PageViewCreated 事件。将此逻辑置于页面的Init 事件中,如果Init 事件过早,则置于页面的Load 事件中。

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

示例

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 谢谢。
  • @SachinTrivedi 刚刚添加了一个示例...但不要只是复制/粘贴...考虑如何将它集成到您​​的解决方案中
  • 这总是会导致问题的。在 Init 或 Load 事件中,因为 Multi Page Control 内部不会有任何页面视图。所以索引会越界。
  • 这是有用的解释,所以投票吧。但在我的情况下似乎还有其他问题。感谢你的关心。也许我会尝试进一步挖掘并提出真正的原因。
  • 在这种情况下,您必须提供一些额外的信息。你在用你的 PageViews 做什么?你是如何创造它们的?声明式还是命令式?
【解决方案2】:

我终于找到了问题所在。请通过This Answer。这正是我的解决方案中发生的事情。

现在,当向映射了默认文档的无扩展名 URL 发出请求时,ASP.NET 4 将 HTML 表单元素的 action 属性值呈现为空字符串。例如,在 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"));
    }
}

希望这会有所帮助。

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2023-03-08
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多