0

我正在重写 URL Urlrewriting.net,并且遇到了似乎是一个常见问题,但我似乎可以修复它。我将介绍一个简化的案例。

URL 重写与规则完美配合:

<urlrewritingnet rewriteOnlyVirtualUrls="true" defaultPage="default.aspx" defaultProvider="RegEx" xmlns="http://www.urlrewriting.net/schemas/config/2006/07">
   <rewrites>
       <add name="catalog" virtualUrl="^~/catalog/(.*)/(.*).aspx" rewriteUrlParameter="ExcludeFromClientQueryString" destinationUrl="~/catalog.aspx?cid=$1&amp;c=$2" ignoreCase="true"/>
   </rewrites>
</urlrewritingnet>

在页面上,我有一个 DataList,里面有 2 个 asp:buttons。单击时,页面会刷新但不执行任何操作。

我按照ScottGu 的文章实现了一个表单控件适配器来重写表单的操作以匹配重写的 URL。

浏览器中的页面 URL:http://...../dev/catalog/13/Music.aspx

<form name="aspnetForm" method="post" action="/dev/catalog/13/Music.aspx" id="aspnetForm"> 

我现在在表单操作上看到了正确的 URL,并且在调试时我可以看到页面加载事件触发。

现在的问题是,每次页面加载 Page.IsPostback 时都是错误的,导致页面重新绑定 DataList 并因此忽略应该触发的 ItemCommand 按钮。

if (!Page.IsPostBack)
     PopulateControls();

我正在使用 .NET 3.5 SP1,母版页上有一个 ScriptManager,但此页面上没有 UpdatePanel。我也尝试过重置 Form.Action 属性并绕过 ScottGu 的解决方案,结果相同。如果我不使用重写器直接访问页面 URL,一切正常。

我错过了什么?

4

5 回答 5

2

这是 LinkBut​​ton 问题,应该从页面中删除的所有链接按钮都包括母版页。

于 2010-10-30T12:24:38.273 回答
1

坚持是有回报的。原来问题是母版页上的以下代码:

<asp:LinkButton runat="server" PostBackUrl="~/basket.aspx" Text="View Cart" CausesValidation="false" />

我用标准<a>标签替换了它,一切都很好。

不知道为什么这会有所不同。我猜在重写 URL 时,任何 PostBackUrl 或 NavigateUrls 都会破坏回发。

于 2010-09-30T17:09:35.383 回答
0

萨米是对的。我花了大约 5 个小时才发现问题。

我阅读了许多关于“ASP.NET Url Re-writing and Postback Problem”的文章,直到找到问题所在。你不需要像这样的解决方案: http ://weblogs.asp.net/jezell/archive/2004/03/15/90045.aspx 他们也不起作用......

解决方案是:您可以使用 asp:Linkbutton、asp:Button、asp:ImageButton 但不要设置他们的 postbackurl。只需使用< a >标签而不是链接按钮。

于 2011-03-05T05:29:46.010 回答
0

这连续困扰了我 4 个小时。

我使用的答案实际上是删除所有 postbackurl 和 navigateurl。

其他一切都失败了,但这就像一个魅力。真的很疯狂,这是怎么回事,但确实如此。

于 2011-06-06T15:30:45.457 回答
0

我遇到了同样的问题 - UrlRewriter 和按钮的回发值始终为假。(没有指定 PostBackUrl 的链接按钮)

我添加了 ScottGu 的 FormControlAdapter,它对我有用 - 但是 - 过了一会儿,我注意到我的加载时间真的很痛苦。我最终将其追踪到 base.Render(new RewriteFormHtmlTextWriter(writer));FormControlAdapter 中的事件,该事件有时需要 5 秒以上才能完成。

如果我从 .browser 文件中删除了 FormControlAdapter,主页按钮将不再正确回发(始终为 false)。

在我的主页上,表单标签使用空操作属性呈现 <form action="" >

在我的情况下,有问题的按钮在我的母版页上。通过在我的 MasterPage 的 Page_Load 事件中手动设置表单的操作(在我的情况下为“default.aspx”),我能够删除 FormControlAdapter 并且按钮正确回发。

protected void Page_Load(object sender, EventArgs e)
 {
     if (Request.RawUrl == "/" || Request.RawUrl == "/default.aspx")
         form1.Action = "default.aspx";
     else
         form1.Action = Request.RawUrl;

看来,真正需要的只是设置表单 Action。ScottGu 的解决方案很好且灵活,但似乎真的很慢

于 2014-10-06T12:59:37.363 回答