按钮点击工作随机asp.net



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

我正在将用户控件作为页面加载到该控件中。

下面是加载用户控件的代码。
 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.");
        }
    }

我还启用了viewstate和autoeventwireup。

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

现在我遇到的问题是用户控件上的按钮。该按钮的click事件没有被触发。它只是重新加载页面。甚至IsPostBack也返回false。

谁能提出解决办法?有时,点击事件会起作用,但大多数时候不起作用。

这是一个典型的页面生命周期问题。我猜发生的事情是,当回发被触发时,页面没有关于哪个控件触发回发的线索,因为当它进行评估时,按钮(和它的父UserControl)还没有添加到页面的控件层次结构…所以,我把我的手指指向RadMultiPage1_PageViewCreated事件处理程序。在我看来,动态地向页面添加服务器控件是一个尴尬的地方。

建议

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

您可以通过检查SelectedIndex属性或SelectedPageView属性来确定在RadMultiPage控件中选择了哪个页面。但是,如果您将RadTabStrip控件与RadMultiPage控件结合使用,则可以检查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.");
        }
}

终于找到问题了。请把这个答案看一遍。这正是我的解决方案所发生的。

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打开表单标记,如下例所示:

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

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

将其添加到global。

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"));
    }
}

希望对大家有帮助。

谢谢。

最新更新