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

时间:2008-11-15 16:53:40

标签: c# .net asp.net .net-3.5

在我的母版页中,我有<form ... action="" ...>,在SP1之前,如果我查看了源,则action属性将是一个空字符串。在SP1中,动作属性被覆盖“MyPage.aspx?MyParams”,不幸的是,这导致我的回发失败,因为我在URL中有额外的pathinfo(即MyPage.aspx \ CustomerData?MyParams)。我已经检查了OnLoad事件中的action属性,此时它仍然是空白的,所以SP1的某个地方覆盖了这个:(。

抱歉,我刚刚意识到我的部分内容丢失了,因为我没有正确使用降价。

4 个答案:

答案 0 :(得分:5)

也许您可以在this ASP.NET Forum post中找到解决方案(.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将动作属性视为死代码):

<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> 

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我们最终所做的只是覆盖了动作用户一个控制器。这适用于我们,但是一般解决方案。

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
        }
    }

}

答案 3 :(得分:0)

这可能是一个旧线程,但我设法找到一个有趣的黑客。只需将表单的操作设置为“#”,它似乎回复了一个没有问题的重写URL。