我的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也是如此。
任何人都可以建议一些解决方案吗?碰巧有时候点击事件会起作用,而且大部分时间它都不起作用。
答案 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"));
}
}
希望这会有所帮助。
感谢。