2

使用以下代码:

<form id="form1" action="" runat="server">

(即使在页面加载中使用此代码隐藏form1.Action = string.Empty;:)

...这是我得到的意外结果:

<form method="post" id="form1" name="form1" action="layouts/Default.aspx">

这是预期的结果,我希望您能帮助完成:

<!-- either action="" or no action attribute at all -->
<form method="post" id="form1" name="form1" action="">

AppPool 设置为运行 Integrated .NET v2.0.50727(我已通过打印运行时版本进行了验证)。.NET Framework v4.5 安装在服务器上(与 Visual Studio 2012 一起)。

这肯定是某种开发环境问题,原因是action=""我的两个同事在他们的本地环境中输出了相同的代码库。它们在很大程度上具有与我相同的系统环境规范:

  • Windows Server 2008 R2 64 位
  • 视觉工作室 2012
  • .NET 框架 v4.5
  • 相同的 AppPool 设置(我们已经检查了两次和三次)
  • 相同的代码库(SVN 控制),包括完全相同的web.config

ASP.NET v3.5 SP1(在 v4.0 中更好地宣布)中的这一重大变化可能是相关的。它解释了这种行为。但是,它并没有解释为什么只有我的运行时才会获得这种重大变化。

另请注意,我已经使用该aspnet_regiis工具尝试了所有可用的命令组合(无济于事),即来自不同的 .NET 版本文件夹以及卸载/重新安装和使用-c-i

4

2 回答 2

0

以下丑陋的解决方法是我迄今为止找到的唯一解决方案。我将表单子类化以删除override void RenderBeginTag.

[ToolboxData("<{0}:HtmlFormNoAction runat=\"server\"></{0}:HtmlFormNoAction>")]
public class HtmlFormNoAction : HtmlForm
{
    protected override void RenderBeginTag(HtmlTextWriter writer)
    {
        var htmlString = new StringBuilder(); // this will hold the string
        var stringWriter = new StringWriter(htmlString);
        var htmlWriter = new HtmlTextWriter(stringWriter);
        base.RenderBeginTag(htmlWriter);
        htmlWriter.Flush();
        var formBeginTag = htmlString.ToString();
        var formBeginTagWithoutAction = RemoveActionAttribute(formBeginTag);

        writer.Write(formBeginTagWithoutAction);
    }

    private string RemoveActionAttribute(string formBeginTag)
    {
        const string actionStart = "action=\"";
        if (!formBeginTag.Contains(actionStart))
            return formBeginTag;

        var start = formBeginTag.IndexOf(actionStart);
        var end = formBeginTag.IndexOf("\"", start + actionStart.Length);
        return formBeginTag.Substring(0, start) + formBeginTag.Substring(end + 1);
    }
}
于 2013-01-10T11:13:11.577 回答
0

检查这个:https ://msdn.microsoft.com/en-us/library/ms972974.aspx

namespace ActionlessForm {
  public class Form : System.Web.UI.HtmlControls.HtmlForm
  {
     protected override void RenderAttributes(HtmlTextWriter writer)
     {
        writer.WriteAttribute("name", this.Name);
        base.Attributes.Remove("name");

        writer.WriteAttribute("method", this.Method);
        base.Attributes.Remove("method");

        this.Attributes.Render(writer);

        base.Attributes.Remove("action");

        if (base.ID != null)
           writer.WriteAttribute("id", base.ClientID);
     }
  }
}

还有这个: http: //www.codeproject.com/Articles/19672/A-Smart-Form-Control-for-ASP-NET-URL-Rewriting

于 2016-07-14T06:05:55.157 回答