繁体   English   中英

如何防止ASP.NET 3.5 SP1覆盖我的操作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM