[英]How to prevent ASP.NET 3.5 SP1 from overriding my action?
在我的母版页中,我具有<form ... action="" ...>
,在SP1之前的版本中,如果查看源代码,则action属性将是一个空字符串。 不幸的是,在SP1中,操作属性被覆盖“ MyPage.aspx?MyParams”,这会导致我的回发失败,因为URL中有其他pathinfo(即MyPage.aspx \\ CustomerData?MyParams)。 我已经在OnLoad事件中检查了action属性,但此时它仍为空白,因此SP1覆盖了::。
抱歉,我只是意识到我的帖子的一部分丢失了,因为我没有正确使用markdown。
也许您可以在此ASP.NET论坛帖子 (.NET 3.5 Service Pack 1中ASP.NET的已知问题/重大更改)中找到解决方案。
现在,在声明性标记中定义HtmlForm操作属性即可。
3.5 SP1向HtmlForm类型添加了可设置的Action属性。 对于开发人员要使用与普通回发生成的Url不同的Url的方案,此新功能使开发人员更容易显式设置表单的action属性。 但是,此更改还意味着,如果已在.aspx页的声明性标记中设置了action属性,则ASP.NET将在呈现<form />
元素时使用标记中的设置。
如果<form />
元素的声明性标记中存在动作属性,则以前版本的ASP.NET始终会忽略该动作属性。 开发人员应从其声明性标记中删除action属性,以返回到ASP.NET呈现回发URL的原始行为。
之前(ASP.NET将action属性作为死代码忽略):
<form name="form1" method="post" runat="server" action="test.aspx"></form>
3.5 SP1(删除action属性以使ASP.NET呈现回发URL):
<form name="form1" method="post" runat="server"></form>
MrJavaGuy的很好的解决方案,但是代码中有错别字,因为此处粘贴代码并不总是可以正常工作。 WriteAttribute方法上有一个重复项,更正后的代码如下-
public class HtmlFormAdapter : ControlAdapter
{
protected override void Render(HtmlTextWriter writer)
{
HtmlForm form = this.Control as HtmlForm;
if (form == null)
{
throw new InvalidOperationException("Can only use HtmlFormAdapter as an adapter for an HtmlForm control");
}
base.Render(new CustomActionTextWriter(writer));
}
public class CustomActionTextWriter : HtmlTextWriter
{
public CustomActionTextWriter(HtmlTextWriter writer) : base(writer)
{
this.InnerWriter = writer.InnerWriter;
}
public override void WriteAttribute(string name, string value, bool fEncode)
{
if (name == "action")
{
value = "";
}
base.WriteAttribute(name, value, fEncode);
}
}
}
这可能是一个旧线程,但我设法找到了一个有趣的技巧。 只需将表单的操作设置为“#”,这似乎可以毫无问题地发回重写的URL。
最后,我们所做的只是超越了动作用户的控制适配器。 这对我们有效,但不是一般解决方案。
public class HtmlFormAdapter : ControlAdapter
{
protected override void Render(HtmlTextWriter writer)
{
HtmlForm form = this.Control as HtmlForm;
if (form == null)
{
throw new InvalidOperationException("Can only use HtmlFormAdapter as an adapter for an HtmlForm control");
}
base.Render(new CustomActionTextWriter(writer));
}
public class CustomActionTextWriter : HtmlTextWriter
{
public CustomActionTextWriter(HtmlTextWriter writer) : base(writer)
{
this.InnerWriter = writer.InnerWriter;
}
public override void WriteAttribute(string name, string value, bool fEncode)
{
public override void WriteAttribute(string name, string value, bool fEncode)
{
if (name == "action")
{
value = "";
}
base.WriteAttribute(name, value, fEncode); //// override action
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.