2

次のコードを使用します。

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

(Page Load のこのコード ビハインドでも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=""2 人の同僚のローカル環境でまったく同じコードベースが出力されるためです。システム環境の仕様は、私とほぼ同じです。

  • Windows Server 2008 R2 64 ビット
  • ビジュアル スタジオ 2012
  • .NET フレームワーク v4.5
  • 同じ AppPool 設定 (2 回および 3 回チェックしました)
  • まったく同じものを含む、同じコードベース (SVN 制御)web.config

ASP.NET v3.5 SP1 でのこの重大な変更 (v4.0 でより適切に発表された) が関連している可能性があります。挙動を説明しています。ただし、私のランタイムだけがこの重大な変更を取得する理由は説明されていません。

aspnet_regiisまた、ツールを使用して(無駄に)、つまりさまざまな.NETバージョンのフォルダーから、アンインストール/再インストールおよび使用など-c、使用可能なすべてのコマンドの組み合わせを試したことに注意してください。-i

4

2 に答える 2

0

次の醜い回避策は、私がこれまでに見つけた唯一の解決策です。のaction属性を削除するために、フォームをサブクラス化しています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 に答える